如何使用 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&lt;Example&gt; 而不是单个 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&lt;T&gt; 重载而不是您当前使用的非通用版本反序列化 List&lt;Example&gt;

    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列表?

如何使用 NewtonSoft Json.Net 将 Json 字典反序列化为平面类

如何使用 newtonsoft json 解决有关无法反序列化当前(例如 “name”:“value”)的难题 [关闭]

使用 Newtonsoft Json 从流中反序列化多个 json 对象

使用Newtonsoft.Json.dll序列化和反序列化