将此 Json 转换为 C# 中正确的 class 结构是什么?
What is the correct class structure in C# to convert this Json into?
我有以下来自 Rest 服务的 Json,我正在尝试使用此代码将其反序列化为 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 正确反序列化?
尝试像这样更改报告 class(class 名称可以是任何名称,属性 必须是报告)
public class WorkReport
{
public List<WorkItem> Report;
}
它应该尝试在根目录反序列化为一个 class 和一个名为 Report 的 array/list 个工作项对象。
你可以尝试这样的事情。我已将 List
更改为 Dictionary
您没有在根级别定义 class。 class结构需要匹配整个JSON,不能只从中间反序列化。只要你有一个对象的键可以改变,你就需要使用字典。普通的 class 对此不起作用;列表也不会。
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);
我建议使用 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; }
}
我有以下来自 Rest 服务的 Json,我正在尝试使用此代码将其反序列化为 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 正确反序列化?
尝试像这样更改报告 class(class 名称可以是任何名称,属性 必须是报告)
public class WorkReport
{
public List<WorkItem> Report;
}
它应该尝试在根目录反序列化为一个 class 和一个名为 Report 的 array/list 个工作项对象。
你可以尝试这样的事情。我已将 List
更改为 Dictionary
您没有在根级别定义 class。 class结构需要匹配整个JSON,不能只从中间反序列化。只要你有一个对象的键可以改变,你就需要使用字典。普通的 class 对此不起作用;列表也不会。
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);
我建议使用 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; }
}