如何使用JSON.net将JSON反序列化为嵌套类?

29 浏览
0 Comments

如何使用JSON.net将JSON反序列化为嵌套类?

这个问题已经有答案了

如何将JSON反序列化为C#动态对象?

我有一个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 Messages = new List();
    public List Customers = new List();
}

使用这段代码:

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

但它给我返回Data.CustomersData.Messages的空列表。代码没有将数据从JSON填充到我的List类型的对象中。我的意思是Data.Customers.CountData.Messages.Count都等于0

admin 更改状态以发布 2023年5月21日
0
0 Comments

JSON转换器将查找名为customermessage的属性。但是在你的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("{\"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 Messages = new List();
    [JsonProperty(PropertyName = "customer")]
    public List Customers = new List();
}

然后,你可以将原始字符串反序列化如下:

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

0
0 Comments

你可以使用VS菜单编辑 -> 粘贴特殊 -> 粘贴JSON作为类,看看你的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。

0