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

如何在Newtonsoft的JArray中添加带键的JObject?

解决Newtonsoft.Json中JArray添加带键元素的问题

Hey there! Let's sort out this problem for you. First, I need to clarify a critical JSON syntax point that's causing your confusion:

你期望生成的 { "items" : [ "item 1" : { }, "item 2" : { }, ] } 其实是不符合JSON规范的。JSON数组([])的元素只能是值类型(字符串、数字、对象、数组等),不能直接存放键值对——键值对是JSON对象({})的专属结构。

这就是为什么你尝试给JArray添加带键元素会抛出异常:JArray的设计目的是存储有序的无键元素集合,它本身不支持直接添加键值对。

下面给你两种符合规范的实现方案,你可以根据实际需求选择:

方案一:将items设为JSON对象(适合用"item 1"作为唯一标识的场景)

如果你的核心需求是给每个子对象设置专属标识,那么把items做成对象而非数组更合理,最终生成的JSON结构如下:

{
  "items": {
    "item 1": {},
    "item 2": {}
  }
}

对应的C#代码:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

// 初始化外层根对象
JObject rootObj = new JObject();

// 创建items对象,用于存储带键的子对象
JObject itemsContainer = new JObject();
itemsContainer.Add("item 1", new JObject()); // 添加第一个带键的子对象
itemsContainer.Add("item 2", new JObject()); // 添加第二个带键的子对象

// 将items对象绑定到外层的"items"属性
rootObj["items"] = itemsContainer;

// 输出格式化后的JSON
Console.WriteLine(rootObj.ToString(Formatting.Indented));

方案二:保留数组结构,每个数组元素是含单个键值对的对象

如果你必须用数组来存储(比如需要严格保持元素顺序),可以把每个带键的子对象包装成独立的JObject,再加入数组,最终生成的JSON结构如下:

{
  "items": [
    { "item 1": {} },
    { "item 2": {} }
  ]
}

对应的C#代码:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

// 初始化外层根对象
JObject rootObj = new JObject();

// 创建items数组
JArray itemsArray = new JArray();

// 创建带键的子对象并添加到数组
itemsArray.Add(new JObject(new JProperty("item 1", new JObject())));
itemsArray.Add(new JObject(new JProperty("item 2", new JObject())));

// 将数组绑定到外层的"items"属性
rootObj["items"] = itemsArray;

// 输出格式化后的JSON
Console.WriteLine(rootObj.ToString(Formatting.Indented));

这两种方案都能满足你给子对象设置标识的需求,同时完全符合JSON语法规范,不会再出现异常问题啦。

内容的提问来源于stack exchange,提问作者Ahmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:07:47