【问题标题】:How to deserialize JSON to a nested class using JSON.net? [duplicate]如何使用 JSON.net 将 JSON 反序列化为嵌套类? [复制]
【发布时间】:2020-02-25 02:35:28
【问题描述】:

我有 JSON:

{"customer":[{"phone":"9868133331"},{"phone":"9971714514"}],"message":[{"type":"reminder"},{"type":"reminder"}]}

格式如下:

{
  "customer": [
    {
      "phone": "9868133331"
    },
    {
      "phone": "9971714514"
    }
  ],
  "message": [
    {
      "type": "reminder"
    },
    {
      "type": "reminder"
    }
  ]
}

我正在尝试在嵌套类中映射 JSON:

public class AllData
{
    public class Message
    {
        public String Type;
    }

    public class Customer
    {
        public String Phone;
    }

    public List<Message> Messages = new List<Message>();
    public List<Customer> Customers = new List<Customer>();
}

带代码:

AllData Data = new AllData();
Data = Newtonsoft.Json.JsonConvert.DeserializeObject<AllData>(JSON);

但它给了我Data.CustomersData.Messages 的空列表。该代码不会将 JSON 中的数据填充到我的 List 类型的对象中。我的意思是Data.Customers.CountData.Messages.Count 等于0

【问题讨论】:

  • 您的属性名称与 json 数据不匹配
  • @BurnsBA 请告诉我要修复哪条线路?

标签: c# json json.net


【解决方案1】:

您可以使用 VS 菜单 Edit -&gt; Paste special -&gt; Paste JSON as classes 并查看您的 JSON 应该是什么样子。实际上,它看起来像

public class AllData
{
    public Customer[] customer { get; set; }
    public Message[] message { get; set; }
}

public class Customer
{
    public string phone { get; set; }
}

public class Message
{
    public string type { get; set; }
}

您应该更新属性名称或使用JsonProperty 属性装饰它们。您还应该为集合属性指定 getter 和 setter

【讨论】:

    【解决方案2】:

    JSON 转换器将查找名为 customer 的属性和名为 message 的属性。但是您的AllData 课程中都不存在其中任何一个。

    观察,如果你有类似的数据

    var ad = new AllData();
    ad.Messages.Add(new AllData.Message() { Type = "reminder" });
    ad.Messages.Add(new AllData.Message() { Type = "reminder" });
    ad.Customers.Add(new AllData.Customer() { Phone = "9868133331" });
    ad.Customers.Add(new AllData.Customer() { Phone = "9971714514" });
    

    然后序列化

    Newtonsoft.Json.JsonConvert.SerializeObject(ad)
    

    会给出字符串

    "{\"Messages\":[{\"Type\":\"reminder\"},{\"Type\":\"reminder\"}],\"Customers\":[{\"Phone\":\"9868133331\"},{\"Phone\":\"9971714514\"}]}"  
    

    您可以将其重新序列化回AllData 对象:

    AllData ad2 = Newtonsoft.Json.JsonConvert.DeserializeObject<AllData>("{\"Messages\":[{\"Type\":\"reminder\"},{\"Type\":\"reminder\"}],\"Customers\":[{\"Phone\":\"9868133331\"},{\"Phone\":\"9971714514\"}]}");
    

    现在,如果需要,您可以更改类定义,使用 JsonProperty 属性将 JSON message 对象序列化为类 Messages 属性:

    using Newtonsoft.Json;
    public class AllData
    {
        public class Message
        {
            public String Type;
        }
    
        public class Customer
        {
            public String Phone;
        }
    
        [JsonProperty(PropertyName = "message")]
        public List<Message> Messages = new List<Message>();
    
        [JsonProperty(PropertyName = "customer")]
        public List<Customer> Customers = new List<Customer>();
    }
    

    然后您可以按照给定的方式反序列化原始字符串:

    AllData ad3 = Newtonsoft.Json.JsonConvert.DeserializeObject<AllData>("{\"customer\":[{\"phone\":\"9868133331\"},{\"phone\":\"9971714514\"}],\"message\":[{\"type\":\"reminder\"},{\"type\":\"reminder\"}]}");
    

    【讨论】:

      【解决方案3】:
           var res = Data = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(JSON);
      
      
          public class Customer
          {
              public string phone { get; set; }
          }
      
      
      
          public class Message
          {
              public string type { get; set; }
          }
      
          public class RootObject
          {
              public List<Customer> customer { get; set; }
              public List<Message> message { get; set; }
          }
      

      【讨论】:

        【解决方案4】:

        我使用 JsonConvert 将 JSON 反序列化为此对象结构:

        public class ResPLP
        {
            public string status { get; set; }
            public ResPLPData data { get; set; }
        }
        public class ResPLPData
        {
            public string message { get; set; }
            public string codigo { get; set; }
            public int id { get; set; }
            public string qr { get; set; }
        }
        

        和json结构:

        {
        "status":"success",
        "data": 
        {"message":"ok","codigo":"64581D","id":0136,"qr":"4a1db513cde17d4c35cb1d4.png"}
        }
        

        以及反序列化对象:手动清理结果内容中的字符串。

        var resp = response.Content.ReadAsStringAsync().Result;
        resp = resp.Trim("\"".ToCharArray());
        resp = resp.Replace("\\", "");
        ResPLP resplp = JsonConvert.DeserializeObject<ResPLP>(resp);
        codres = resplp.data;
        

        【讨论】:

          猜你喜欢
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-17
          • 1970-01-01
          • 1970-01-01
          • 2021-03-02
          相关资源
          最近更新 更多