VB使用Newtonsoft Json.NET循环生成JSON时JObject插入JArray失败问题
问题解决方法
核心错误原因
你要生成的目标JSON根结构是**对象(JObject)**而非数组(JArray),你当前用JArray作为根容器,自然无法得到你要的键值对结构。你现在的写法会把每行变成一个单独的小对象塞到数组里,输出的结构是[{"-001-":{...}},{"-002-":{...}}],和需求完全不符。
修正后可运行代码
' 根容器用JObject而非JArray Dim rootObj As New JObject() For Each row In dtgAssociazione.Rows ' 跳过空行的健壮性处理,可根据业务需求调整 If row Is Nothing OrElse row.Cells(0).Value Is Nothing Then Continue For ' 构造每行对应的子属性对象 Dim childObj = New JObject( New JProperty("value", If(row.Cells(1).Value, "")), New JProperty("substring", If(row.Cells(2).Value, "")) ) ' 直接把行的Cells(0)值作为键,添加到根对象中 rootObj.Add(row.Cells(0).Value.ToString(), childObj) Next ' 转成标准JSON字符串即可存入数据库 Dim resultJsonStr As String = rootObj.ToString()
最佳实践建议
- 容器选择匹配结构:键值对结构用
JObject作为容器,有序列表结构才用JArray,不要混淆两种容器的使用场景。 - 异常前置处理:提前判断单元格值是否为空,避免生成JSON时出现空引用异常,也可根据业务规则添加值合法性校验。
- 键唯一性校验:要确保
row.Cells(0)的值不会重复,往JObject中添加重复键会直接抛出异常,存在重复值场景时可提前做去重或者冲突处理逻辑。 - 复杂场景简化:如果后续JSON结构复杂度上升,可先定义对应的VB实体类,把行数据转成类实例后直接用
JsonConvert.SerializeObject序列化生成JSON,代码可读性和可维护性会更高。
内容的提问来源于stack exchange,提问作者AlexMagic
相关产品推荐
相关产品推荐

