牛顿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反序列化为对象

由于json的第二级除了MUMBAIDELHI之外,还可以有任何字符串值,因此需要将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;}
}

正如另一个答案所提到的,您的responseDatanull的第一个原因是,与给定的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功能的其他信息,可以在他们的文档页面中找到