Newtonsoft在JArray中添加键控JObject

时间:2019-09-28 18:37:11

标签: c# json json.net

我已经尝试了无数次,还尝试查阅Newtonsoft网站提供的文档,但是关于我的问题似乎没有任何答案。我还搜索了Google无济于事,浪费了大约4个小时,没有答案,只是继续没有它。

我的问题是无法通过键将JObject添加到JArray中。我知道这似乎很简单,但是我尝试做的所有事情最终导致抛出异常。

我正在尝试编写具有以下布局的简单文件:

{
    "items" : [
        "item 1" : {   }, 
        "item 2" : {   }, 
   ] 
} 
// the actual layout that I have is
{
    "items" : [
        {   }, 
        {   }, 
   ] 
} 

我可以通过items为JArray成功添加第一个jobj["items"] = jarray键,但是我似乎无法对JArray使用相同的技术。我需要通过JArray.Add()在JArray中添加项目,但不允许我提供密钥。我真的迷失了。有人可以解释一下如何实现上述布局吗?谢谢。

2 个答案:

答案 0 :(得分:0)

正如评论中建议的那样,我想要的布局不是正确的布局。看起来json需要数组中的一个匿名对象来保存键对象。

因此布局应为:

{
    "items" : [
        { 
            "item1" : {   } 
        }, 
....... 
   ] 
} 

答案 1 :(得分:0)

如@dbc所述,您要求的格式无效。您可以实现的最接近的有效格式如下。

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

您可以使用包含Dictionary的Data结构来实现。例如

var data = new DataStructure{ 
                                items = new Dictionary<string,Item>()
                                    {
                                    ["Item 1"] = new Item{},
                                    ["Item 2"] = new Item{}
                                    }};

其中DataStructure和Item定义为

public class DataStructure
{
    public Dictionary<string,Item> items{get;set;}
}
public class Item
{

}

如果您不想创建具体的类,则可以使用匿名类型实现相同的目的

var data = new {items = new Dictionary<string,Item>()
                                {
                                ["Item 1"] = new Item{},
                                ["Item 2"] = new Item{}
                                }};

或者,如果您也想避免创建Item Class

var data = new {items = new Dictionary<string,object>()
                                {
                                ["Item 1"] = new {},
                                ["Item 2"] = new {}
                                }};

输出

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