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