牛顿JSON反序列化为对象
本文关键字:对象 反序列化 JSON 牛顿 | 更新日期: 2023-09-27 18:29:34
我有一个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);
由于json的第二级除了MUMBAI
和DELHI
之外,还可以有任何字符串值,因此需要将details
属性类型更改为Dictionary<string, Cars>
,其中Cars
是包含List<Car>
属性的类。将您的类定义更改为以下
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; }
}
并使用以下代码将json反序列化为RootObject
的实例
var responseData = JsonConvert.DeserializeObject<RootObject>(jsonResponse);
您可以枚举responseData
的嵌套属性来获得汽车的属性。例如,如果我们使用上面的json,responseData.details["MUMBAI"].Car[0].id
将返回"ABC"
,responseData.details["DELHI"].Car[3].category_id
将返回"delivery"
。
演示:https://dotnetfiddle.net/dIYHNB
您忘记了s
这应该使它工作
public class RootObject
{
public Detail details{get; set;}
}
正如另一个答案所提到的,您的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功能的其他信息,可以在他们的文档页面中找到