ResultSet无法获取全部dataColumn值,SQL Server JSON数组数据重复问题
解决JSON数组重复写入最后一条数据的问题
嘿,这个问题我之前踩过一模一样的坑!大概率是你在构建JSON的过程中犯了两个常见错误之一:要么是重复引用了同一个对象,要么是字符串拼接时逻辑出错重复添加了最后一条数据。
情况1:引用类型重复引用(C#/JavaScript等语言常见)
举个例子,如果你在循环外面创建了一个对象,每次循环只修改它的属性再加入数组,那数组里的所有元素其实都是同一个对象的引用——最后一次修改会覆盖之前的所有引用,导致数组里全是最后一条数据。
错误代码示例(C#):
var holidayObj = new JObject(); // 循环外创建对象 var holidayArray = new JArray(); while (reader.Read()) { holidayObj["date"] = reader["holidays"].ToString(); holidayArray.Add(holidayObj); // 每次加的都是同一个对象引用 }
正确写法:
把对象创建放到循环内部,每次循环都生成新的对象:
var holidayArray = new JArray(); while (reader.Read()) { var holidayObj = new JObject(); // 循环内新建对象 holidayObj["date"] = reader["holidays"].ToString(); holidayArray.Add(holidayObj); }
如果是JavaScript,错误和正确写法逻辑完全一致:
// 错误写法 let holidayObj = {}; let holidayArr = []; dates.forEach(date => { holidayObj.date = date; holidayArr.push(holidayObj); }); // 正确写法 let holidayArr = []; dates.forEach(date => { let holidayObj = { date: date }; // 每次新建对象 holidayArr.push(holidayObj); });
情况2:字符串拼接逻辑错误
如果你是用StringBuilder或者直接拼接字符串来生成JSON,可能是最后处理逗号的时候不小心重复添加了最后一条数据。
错误代码示例(C#):
StringBuilder sb = new StringBuilder(); sb.Append("["); string lastDate = ""; while (reader.Read()) { lastDate = reader["holidays"].ToString(); sb.Append($"{{\"date\":\"{lastDate}\"}},"); } // 错误:这里又手动加了一次lastDate,导致重复 sb.Append($"{{\"date\":\"{lastDate}\"}}]");
正确写法:
用标记判断是否是第一个元素,避免多余逗号,也不用额外重复添加:
StringBuilder sb = new StringBuilder(); sb.Append("["); bool isFirstItem = true; while (reader.Read()) { if (!isFirstItem) sb.Append(","); // 非第一个元素前加逗号 string date = reader["holidays"].ToString(); sb.Append($"{{\"date\":\"{date}\"}}"); isFirstItem = false; } sb.Append("]");
你可以对照自己的代码看看属于哪种情况,调整后应该就能解决重复的问题啦~
内容的提问来源于stack exchange,提问作者Sagitarius
相关产品推荐
相关产品推荐

