c#中转换Json的正确类结构是什么?
本文关键字:结构 是什么 转换 Json | 更新日期: 2023-09-27 18:12:27
我有下面的Json来自一个Rest服务,我试图用这个代码将它反序列化成一个c#对象:
var _deserializer = new JsonDeserializer();
var results = _deserializer.Deserialize<Report>(restResponse);
反序列化方法一直返回null,这告诉我c#对象的结构不正确。
下面是Json和我对c#定义的最新尝试。
{
"Report": [
{
"ID": "0000014",
"Age": "45",
"Details": [
{
"Status": "Approved",
"Name": "Joe"
},
{
"Status": "Approved",
"Name": "Bill"
},
{
"Status": "Submitted",
"Name": "Scott"
}
]
},
{
"ID": "10190476",
"Age": "40",
"Details": [
{
"Status": "Approved",
"Name": "Scott"
}
]
},
{
"ID": "10217480",
"Age": "40",
"Details": [
{
"Status": "Approved",
"Name": "Scott"
}
]
}
]
}
这是我的c#对象:
public class Report
{
public List<WorkItem> Item= new List<WorkItem>();
}
public class WorkItem
{
public string ID { get; set; }
public int Age { get; set; }
public List<Details> Details { get; set; }
}
public class Details
{
public string Status { get; set; }
public string Name { get; set; }
}
有人可以建议什么是错误的我的c#对象定义,使这个json反序列化正确?
我建议使用Json2Csharp.com来生成类。
public class Detail
{
public string Status { get; set; }
public string Name { get; set; }
}
public class Report
{
public string ID { get; set; }
public string Age { get; set; }
public List<Detail> Details { get; set; }
}
public class RootObject
{
public List<Report> Report { get; set; }
}
尝试像这样改变Report类(类名可以是任何东西,属性必须是Report)
public class WorkReport
{
public List<WorkItem> Report;
}
它应该尝试在根处反序列化为一个类,该类包含一个名为Report的工作项对象的数组/列表。
您可以尝试这样做。我已将List
更改为Dictionary
。您没有在根级别定义类。类结构需要匹配整个JSON,不能只从中间进行反序列化。每当有一个键可以更改的对象时,就需要使用Dictionary。普通的课程是做不到这一点的;List也不会。
public class RootObject
{
[JsonProperty("Report")]
public Report Reports { get; set; }
}
public class Report
{
[JsonProperty("Report")]
public Dictionary<WorkItem> Item;
}
public class WorkItem
{
[JsonProperty("ID")]
public string ID { get; set; }
[JsonProperty("Age")]
public int Age { get; set; }
[JsonProperty("Details")]
public Dictionary<Details> Details { get; set; }
}
public class Details
{
[JsonProperty("Status")]
public string Status { get; set; }
[JsonProperty("Name")]
public string Name { get; set; }
}
然后,像这样反序列化:
Report results = _deserializer.Deserialize<Report>(restResponse);