我有一个像这样的JSON类
{
"Items": {
"Item_1A": {
"prop1": "string",
"prop2": "string",
"prop3": 1,
"prop4": [{
"prop_x": 100
},
{
"prop_y": 200
}]
},
"Item2B": {
"prop1": "string",
"prop2": "string",
"prop3": 14,
"prop4": [{
"prop_z": 300
}]
}
}
}
如何将其纳入C#类?这是我到目前为止的内容:
public class Info
{
public string prop1 {get;set;}
public string prop2 {get;set;}
public int prop3 {get;set;}
public Dictionary<string, List<int>> prop4 {get;set;}
}
public class Response
{
public Dictionary<string, List<Info>> Item {get;set;}
}
我尝试点击此链接,但是没有用 Deserialize nested JSON into C# objects
答案 0 :(得分:0)
以下是在json之后创建代理类的提示:
首先,要确保它是有效的JSON,请访问此网站并运行验证程序:https://jsonlint.com/
如果可以,有一些工具可以将json和xml直接转换为c#代理类,例如:http://json2csharp.com/:https://xmltocsharp.azurewebsites.net/
现在就去!只需将它们复制到您的模型中并开始使用它即可。
答案 1 :(得分:0)
只需对模型进行一些小的更改。您的prop4
则是一个列表或数组。
public class Info
{
public string prop1 {get;set;}
public string prop2 {get;set;}
public int prop3 {get;set;}
public List<Dictionary<string, List<int>>> prop4 {get;set}
}
public class Response
{
public class Dictionary<string, Info> Items {get;set;} // Should be named Items
}
答案 2 :(得分:0)
您的prop4
是Dictionary<string, List<int>>
,在序列化时看起来像这样(为简洁起见,我在发出的JSON中省略了$type
属性):
{
"X": {
"$values": [ 1, 2 ]
},
"Y": {
"$values": [ 3, 4 ]
}
}
您的JSON格式正确,但“形状”错误。它看起来更像一个包含一项字典的数组。
在上面的JSON中,X
和Y
是字典中的键,该字典是以JSON建模的“常规对象”。 $values
代表每个键的整数列表。
答案 3 :(得分:0)
您的数据模型应如下:
public class Info
{
public string prop1 {get;set;}
public string prop2 {get;set;}
public int prop3 {get;set;}
// Modified from
//public Dictionary<string, List<int>> prop4 {get;set}
public List<Dictionary<string, int>> prop4 {get;set;}
}
public class Response
{
// Modified from
//public class Dictionary<string, List<Info>> Item {get;set;}
public Dictionary<string, Info> Items {get;set;}
}
注意:
Response.Item
应该被命名为Items
。
在您的JSON中,"Items"
是一个具有可变名称的对象值属性的对象:
{
"Items": {
"Item_1A": { },
"Item2B": { }
}
}
对于适当的非集合类型Dictionary<string, T>
,应将其建模为T
。假设您正在使用json.net,请参见Serialization Guide: Dictionaries了解详细信息。否则,javascriptserializer的行为类似。
您的数据模型public class Dictionary<string, List<Info>> Items
适用于具有可变名称数组值属性的对象:
{
"Items": {
"Item_1A": [{ },{ }],
"Item2B": [{ }]
}
}
但这不是您所拥有的。
同时"prop4"
是一个数组,其中包含具有可变名称的对象值属性的对象,例如:
"prop4": [ // Outer container is an array
{ // Inner container is an object
"prop_x": 100
},
{
"prop_y": 200
}
]
因此,应将诸如List<T>
之类的集合用作外部通用类型:
public List<Dictionary<string, int>> prop4 {get;set;}
您已经注意到,诸如 How to auto-generate a C# class file from a JSON object string 中提到的那些代码生成工具通常无法识别具有可变属性名称的JSON对象。在这种情况下,可能需要使用包含类型中的相应Dictionary<string, T>
属性来手动替换自动生成的类。
示例工作提琴here。