如何扁平化嵌套JArray?将JArray的JArray转为JObject数组
解决嵌套JArray扁平化为JObject数组的问题
针对你要把嵌套JArray结构扁平化为单一JObject数组的需求,我来帮你梳理更简洁高效的实现方式,同时也点评下你当前的代码方案。
需求回顾
你的输入是外层JArray,每个元素是包含item字段的JObject,item对应一个子JArray;子JArray里的每个元素是带fieldName(键名)和value(键值)的JObject。最终目标是把每个子JArray转成以fieldName为键、value为值的JObject,所有这些JObject组成一个新的JArray。
更简洁的实现方案
你可以借助Newtonsoft.Json的LINQ API来简化代码,避免手动多层循环和字段操作,代码可读性和简洁度都会提升:
using Newtonsoft.Json.Linq; public string FlattenNestedJArray(string json) { var originalArray = JArray.Parse(json); var flattenedArray = new JArray( originalArray.Select(parentItem => new JObject( parentItem["item"].Select(fieldEntry => new JProperty(fieldEntry["fieldName"].ToString(), fieldEntry["value"]) ) ) ) ); return flattenedArray.ToString(); }
代码逻辑说明:
- 先解析原始JSON为
JArray - 用
Select遍历外层数组的每个元素,对每个元素:- 取出
item对应的子数组,再用Select把每个fieldEntry转成JProperty(键为fieldName的值,值为value的值) - 把这些
JProperty直接构建成新的JObject
- 取出
- 最后将所有新的
JObject打包成JArray,转成字符串返回
对现有实现的点评
你的代码逻辑是可行的,但有几个可以优化的点:
- 命名可读性:
temp、fieldname这类命名可以更清晰,比如改成fieldsArray、propertyName,后续维护起来更方便 - 避免修改原对象:你当前的代码是在原
item对象上添加新属性,再移除旧字段,其实完全可以直接构建新的JObject,这样不会对原始数据产生意外修改,逻辑更干净 - 增加空值防护:如果输入中存在
item字段缺失、子数组为空,或者某个fieldEntry缺少fieldName/value的情况,你的代码会抛出异常。建议加上空值判断,比如:if (item["item"] is not JArray fieldsArray) continue; var propertyName = jobject["fieldName"]?.ToString(); var propertyValue = jobject["value"]; if (!string.IsNullOrEmpty(propertyName) && propertyValue != null) { // 执行属性添加逻辑 }
测试结果验证
用你提供的输入示例测试上述方案,会得到符合预期的正确JSON结构(修正了你示例里的语法错误,正确JSON的键值对需要用逗号分隔):
[ { "Name": "Andy", "Phone": "678-905-9872" }, { "Name": "John", "Phone": "688-954-5678" }, { "Name": "Ashley", "Phone": "+44 671 542 8945" }, { "Name": "Avi", "Phone": "(212)-908-7772" } ]
内容的提问来源于stack exchange,提问作者Jane Janiszewski
相关产品推荐
相关产品推荐

