我有一个JSON如下所示我试图将它反序列化为一个C#对象,但是它总是转换为null。如何使用Newton JSON转换它:
JSON:
{
"details": {
"MUMBAI": {
"car": [
{
"id": "ABC"
},
{
"id": "local_taxi",
"text": "Lorem ipsum",
"sub_text": "Lorem ipsum"
},
{
"id": "delivery"
}
]
},
"DELHI": {
"car": [
{
"id": "ABC"
},
{
"id": "ABC"
},
{
"id": "ABC"
},
{
"category_id": "delivery"
}
]
}
}
}
C#代码:
public class RootObject
{
public Detail detail{get; set;}
}
public class Detail
{
public Dictionary<string, Car> CarLst{get; set;}
}
public class Car
{
public string id{get; set;}
public string text{get; set;}
public string sub_text{get; set;}
}
解密的C#代码:
responseData = JsonConvert.DeserializeObject<RootObject>(jsonResponse);
答案 0 :(得分:2)
由于在json的第二级除了MUMBAI
和DELHI
之外可以有任何字符串值,您需要将details
属性类型更改为Dictionary<string, Cars>
其中{{ 1}}是一个包含Cars
属性的类。将您的班级定义更改为以下
List<Car>
使用以下代码
将json反序列化为public class RootObject
{
public Dictionary<string, Cars> details { get; set; }
}
public class Cars
{
public List<Car> Car { get; set; }
}
public class Car
{
public string id { get; set; }
public string text { get; set; }
public string sub_text { get; set; }
public string category_id { get; set; }
}
的实例
RootObject
您可以枚举var responseData = JsonConvert.DeserializeObject<RootObject>(jsonResponse);
的嵌套属性以获取汽车的属性。例如,如果我们使用上述json,responseData
将返回responseData.details["MUMBAI"].Car[0].id
而"ABC"
将返回responseData.details["DELHI"].Car[3].category_id
。
答案 1 :(得分:0)
您忘记了s
这应该可以使它
public class RootObject
{
public Detail details{get; set;}
}
答案 2 :(得分:0)
正如另一个答案所提到的,responseData
为null
的第一个原因是因为与给定的JSON相比,RootObject
类中的属性拼写错误。
即使你修复了这个问题,你仍然会有null
个详细信息,因为JSON中的下一个级别是而不是数组,它们只是另外的嵌套对象。因此,您无法尝试将其转换为Dictionary<string, Car>
。
你拥有的JSON也有点奇怪。根据其结构,您需要为可能在JSON中返回的每个(假设的)城市提供特定属性,这不会使JSON的处理非常动态。
现在要将给定的 JSON转换为可用的类数据结构,您将需要类似于以下类定义的内容。但如上所述,这不是非常可扩展的,并且维护非常繁重。
public class RootObject
{
public Detail details { get; set; }
}
public class Detail
{
[JsonProperty(PropertyName="MUMBAI")]
public City Mumbai { get; set; }
[JsonProperty(PropertyName = "DELHI")]
public City Delhi { get; set; }
// Add more of the above property definitions for each individual city that might be inside the returned JSON,
// which is a very bad design. (Example city of Rohtak)
[JsonProperty(PropertyName = "ROHTAK")]
public City Rohtak { get; set; }
}
public class City
{
public List<Car> car { get; set; }
}
public class Car
{
public string id { get; set; }
public string text { get; set; }
public string sub_text { get; set; }
public string category_id { get; set; }
// Might need to add additional possible properties here
}
有关如何使用JsonProperty
和其他Newtonsoft.Json功能的其他信息,请参阅其文档页面here