You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Newtonsoft.JSON向现有JObject添加含子JObject的JArray

解决Newtonsoft.JSON构造嵌套JSON结构的错误问题

需求是给名为search的JObject添加如下JSON结构:

"sort": [
  {
    "_score": {
      "order": "asc"
    }
  }
]

错误原因分析

  1. 第一种写法报错:

    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异常。

  2. 第二种写法生成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属性的结构。

  3. 补充写法报错:
    嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:05:24