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



我有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

您可以使用VS菜单Edit -> Paste special -> 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

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属性将JSONmessage对象序列化为类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"}]}");
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; }
}

我使用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;

最新更新