如何在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
相关产品推荐
相关产品推荐

