如何使用 Newtonsoft.Json 反序列化 JSON 数组
Posted
技术标签:
【中文标题】如何使用 Newtonsoft.Json 反序列化 JSON 数组【英文标题】:How do I deserialize a JSON array using Newtonsoft.Json 【发布时间】:2016-03-10 06:44:08 【问题描述】:[
"receiver_tax_id":"1002",
"total":"6949,15",
"receiver_company_name":"Das Company",
"receiver_email":"info@another.com",
"status":0
,
"receiver_tax_id":"1001",
"total":"39222,49",
"receiver_company_name":"SAD company",
"receiver_email":"info@mail.com",
"status":1
]
您好,这是我的 Json 数据,但我无法对其进行反序列化。 我只想检查“状态”值。 (第一个对象“状态”0,第二个对象“状态”1)。
示例定义:
public class Example
[JsonProperty("receiver_tax_id")]
public string receiver_tax_id get; set;
[JsonProperty("total")]
public string total get; set;
[JsonProperty("receiver_company_name")]
public string receiver_company_name get; set;
[JsonProperty("receiver_email")]
public string receiver_email get; set;
[JsonProperty("status")]
public int status get; set;
反序列化代码:
var des = (Example)JsonConvert.DeserializeObject(responseString, typeof(Example));
Console.WriteLine(des.status[0].ToString());
【问题讨论】:
向我们展示尝试反序列化您的 JSON 的代码。 var des = (Example)JsonConvert.DeserializeObject(responseString, typeof(Example)); Console.WriteLine(des.status[0].ToString());Example
是如何定义的?
【参考方案1】:
试试这个代码:
public class Receiver
public string receiver_tax_id get; set;
public string total get; set;
public string receiver_company_name get; set;
public int status get; set;
反序列化如下:
var result = JsonConvert.DeserializeObject<List<Receiver>>(responseString);
var status = result[0].status;
【讨论】:
[JsonProperty("receiver_tax_id")] public string receiver_tax_id get;放; [JsonProperty("total")] .....我为每个变量添加了 JsonProperty 如果您使用[JsonProperty("receiver_tax_id")]
,您可以随意命名您的属性。 [JsonProperty("status")]public int MyOwnStatus get; set;
我不知道。谢谢你:)【参考方案2】:
如果您只关心检查status
,您可以使用dynamic
类型的.NET (https://msdn.microsoft.com/en-us/library/dd264741.aspx)
dynamic deserialized = JObject.Parse(responseString);
int status1 = deserialized[0].status;
int status2 = deserialized[1].status;
//
// do whatever
这样你甚至不需要Example
类。
【讨论】:
应该是 JArray.Parse (或 JToken.Parse + 检查反序列化的类型,如果我们不确定输入是否实际有数组)【参考方案3】:从您的代码和 JSON 样本看来,问题在于您实际上是在反序列化 List<Example>
而不是单个 Example
。
我会做两件事:
让您的类遵循 .NET 命名约定,因为您已经为它们添加了正确的 JsonProperty
属性前缀:
public class Example
[JsonProperty("receiver_tax_id")]
public string ReceiverTaxId get; set;
[JsonProperty("total")]
public string Total get; set;
[JsonProperty("receiver_company_name")]
public string ReceiverCompanyName get; set;
[JsonProperty("receiver_email")]
public string ReceiverEmail get; set;
[JsonProperty("status")]
public int Status get; set;
使用通用 JsonConvert.DeserializeObject<T>
重载而不是您当前使用的非通用版本反序列化 List<Example>
:
var des = JsonConvert.DeserializeObject<List<Example>>(responseString);
Console.WriteLine(des[0].Status);
【讨论】:
如果您遇到这个问题,请注意这个答案。我有一个字符串数组作为我遇到此错误的对象中的字段。这让我没有意识到我真正的问题是我在顶层获得了一个项目的列表,并且该对象内的字符串数组很好。【参考方案4】:您正在尝试将数组反序列化为 Example 对象。尝试改为列表:
var des = JsonConvert.DeserializeObject(responseString, typeof(List<Example>)) as List<Example>;
【讨论】:
以上是关于如何使用 Newtonsoft.Json 反序列化 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Newtonsoft.Json 正确反序列化数组中的嵌套对象? [复制]
如何使用 NewtonSoft Json.Net 将 Json 字典反序列化为平面类
如何使用 newtonsoft json 解决有关无法反序列化当前(例如 “name”:“value”)的难题 [关闭]