Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用大括号中的反序列化对象列表?_C#_Json - Fatal编程技术网

C# 如何使用大括号中的反序列化对象列表?

C# 如何使用大括号中的反序列化对象列表?,c#,json,C#,Json,我目前在尝试使用C#Newtonsoft Json获取Json对象时遇到了一个问题 错误报告 尝试对特定对象使用数据协定 这里是代码的链接,您可以使用它在线编译/运行代码 { "data":{ "ticket":{ "budgetcost":1, "id":151002, "icon":"icon2&qu

我目前在尝试使用C#Newtonsoft Json获取Json对象时遇到了一个问题

错误报告 尝试对特定对象使用数据协定

这里是代码的链接,您可以使用它在线编译/运行代码

{  
   "data":{  
      "ticket":{  
         "budgetcost":1,
         "id":151002,
         "icon":"icon2",
         "itemlevel":0,
         "name":"ticket",
         "sellable":"true",
         "override":{  
            "price":{  
               "quantity":1,
               "type":"gold"
            }
         },
         "stackable":"true",
         "stacksize":5000
      },
      "ticket2":{  
         "budgetcost":1,
         "id":151003,
         "icon":"icon2",
         "itemlevel":0,
         "name":"ticket2",
         "sellable":"true",
         "override":{  
            "price":{  
               "quantity":1,
               "type":"gold"
            }
         },
         "stackable":"true",
         "stacksize":11111
      }
   }
}
var settings=newjsonserializersettings();
settings.Formatting=格式化.缩进;
settings.ContractResolver=新字典ArrayResolver();
var foo=JsonConvert.DeserializeObject(json,设置);
WriteLine(“Foo:{”+Foo.Data.Ticket.Count()+“}”);
foreach(foo.Data.Ticket中的变量项)
{
控制台。写入线(项。键);
}
内部类字典ArrayResolver:DefaultContractResolver
{
受保护的重写JsonContract CreateContract(类型objectType)
{
Debug.WriteLine(objectType);
if(objectType.GetInterfaces().Any)(i=>i==typeof(IDictionary)||
i、 IsGenericType&&i.GetGenericTypeDefinition()==typeof(IDictionary)))
返回CreateSerializableContract(objectType);
返回base.CreateContract(objectType);
}
}

它应该写入以控制台字典键,值应该是类对象列表

您的json格式不正确,它不代表字符串字典,列表 下表是

快速提示:有时,当您创建一个对象,序列化它并尝试立即反序列化它时,很容易看到这些错误(或者在本例中,查看它生成的字符串,并将其与您试图读取的内容进行比较)

下面是对象层次结构的正确结构(作为字符串)

{
  "data": {
    "Ticket": {
      "key1": [
        {
          "budgetcost": 1,
          "icon": "icn1",
          "id": 1,
          "itemlevel": 1,
          "name": "name1",
          "override": {
            "price": {
              "quantity": 1,
              "type": "ptypq1"
            }
          },
          "sellable": "yes1",
          "stackable": "yes1",
          "stacksize": 2
        }
      ]
    }
  }
}

您的json格式不正确,它不代表字符串、列表的字典 下表是

快速提示:有时,当您创建一个对象,序列化它并尝试立即反序列化它时,很容易看到这些错误(或者在本例中,查看它生成的字符串,并将其与您试图读取的内容进行比较)

下面是对象层次结构的正确结构(作为字符串)

{
  "data": {
    "Ticket": {
      "key1": [
        {
          "budgetcost": 1,
          "icon": "icn1",
          "id": 1,
          "itemlevel": 1,
          "name": "name1",
          "override": {
            "price": {
              "quantity": 1,
              "type": "ptypq1"
            }
          },
          "sellable": "yes1",
          "stackable": "yes1",
          "stacksize": 2
        }
      ]
    }
  }
}

将DummyClass更新为

 public class DummyClass
{
    [JsonProperty("data")]
    public IDictionary<string, TicketDatum> Data { get; set; }
}
公共类DummyClass
{
[JsonProperty(“数据”)]
公共IDictionary数据{get;set;}
}

将DummyClass更新为

 public class DummyClass
{
    [JsonProperty("data")]
    public IDictionary<string, TicketDatum> Data { get; set; }
}
公共类DummyClass
{
[JsonProperty(“数据”)]
公共IDictionary数据{get;set;}
}

DummyClass的声明在哪里?可能在那个外部链接上?它也应该在这里。DummyClass的声明在哪里?可能在那个外部链接上?它也应该在这里。谢谢,我想也许我必须为属性成员创建单独的类。我绝对不会想到这个,似乎是这样的complex@Proxicide你呢不过,实际上不需要任何自定义的
ContractResolver
。@Proxicide是的,确实是这样。顺便说一句,Json.NET实际上支持开箱即用的功能。每个Json对象都是一个键值列表,具有唯一的键(属性名),也称为字典;o)谢谢你,我想也许我必须为属性成员创建单独的类。我绝对不会想到这一点,似乎complex@Proxicide不过,您并不需要任何自定义的
ContractResolver
。@Proxicide是的,就是这样。顺便说一句,Json.NET实际上支持开箱即用的Json object是具有唯一键(属性名)的键值列表,也称为字典;o)
 public class DummyClass
{
    [JsonProperty("data")]
    public IDictionary<string, TicketDatum> Data { get; set; }
}