如何使用Newtonsoft.JSON向现有JObject添加含子JObject的JArray
解决Newtonsoft.JSON构造嵌套JSON结构的错误问题
需求是给名为search的JObject添加如下JSON结构:
"sort": [ { "_score": { "order": "asc" } } ]
错误原因分析
第一种写法报错:
JProperty orderProperty = new JProperty("order","asc"); JObject scoreObject = new JObject("_score", orderProperty); search.Add("sort", new JArray { new JObject { scoreObject } });问题出在
new JObject("_score", orderProperty):JObject的构造函数若传入键值对,应该是「字符串键 + 对应值」的组合,但这里直接传入JProperty作为值,同时"_score"会被解析为JValue类型,而JObject只能添加JProperty类型元素,因此抛出Can not add Newtonsoft.Json.Linq.JValue to Newtonsoft.Json.Linq.JObject异常。第二种写法生成JSON不符合预期:
JProperty orderProperty = new JProperty("order","asc"); JObject scoreObject = new JObject(); scoreObject.Add(orderProperty); search.Add("sort", new JArray { "_score", scoreObject });这里把"_score"和
scoreObject作为两个独立元素放到了JArray中,导致生成的JSON是两个数组元素,而非一个对象包含_score属性的结构。补充写法报错:
嵌套JObject时参数传递逻辑错误,同样导致了JValue无法添加到JObject的类型异常。
正确写法
分步构建(逻辑清晰,易调试)
// 构建order对应的子对象 JObject orderSubObj = new JObject(); orderSubObj.Add("order", "asc"); // 构建_score属性,值为上面的子对象 JProperty scoreProperty = new JProperty("_score", orderSubObj); // 构建数组中的单个对象,添加_score属性 JObject sortItemObj = new JObject(scoreProperty); // 将对象放入数组后添加到search中 search.Add("sort", new JArray(sortItemObj));
链式简洁写法
如果不需要分步调试,可以直接用链式写法一次性构建:
search.Add("sort", new JArray( new JObject( new JProperty("_score", new JObject("order", "asc") ) ) ));
两种写法最终都会生成符合需求的JSON结构。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

