如何使用Newtonsoft.Json反序列化JSON数组

33
[
   {
      "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数据,但我无法反序列化它。我只想检查“status”的值。(第一个对象的“status”为0,第二个对象的“status”为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的代码。 - Yuval Itzchakov
var des = (示例)JsonConvert.DeserializeObject(responseString, typeof(示例)); Console.WriteLine(des.status[0].ToString()); - Steven
Example 是如何定义的? - Yuval Itzchakov
4个回答

51

尝试这段代码:

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; set; }[JsonProperty("total")] ......我为每个变量添加了JsonProperty。 - Steven
2
如果您使用[JsonProperty("receiver_tax_id")],则可以根据自己的需要命名属性。[JsonProperty("status")]public int MyOwnStatus { get; set; } - Maxim Goncharuk
我不知道。谢谢 :) - Steven

5
如果您只关心检查状态,可以使用.NET的dynamic类型(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类。


3
应该使用JArray.Parse(或JToken.Parse + 检查反序列化类型,如果我们不确定输入是否实际上是数组)。 - Andrzej Martyna

4

从您的代码和JSON示例来看,问题似乎是您实际上反序列化了一个List<Example>而不是单个Example

我会做两件事:

  1. Make your class follow .NET naming conventions, as you already prefixed them with the proper JsonProperty attributes:

    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; } 
    }
    
  2. Deserialize a List<Example> using the generic JsonConvert.DeserializeObject<T> overload instead of the non-generic version you're currently using:

    var des = JsonConvert.DeserializeObject<List<Example>>(responseString); 
    Console.WriteLine(des[0].Status);
    

如果您遇到这个问题,请关注此答案。我在对象的字段中有一个字符串数组,导致我没有意识到我的真正问题是我在顶层获取了一个项目列表,而该对象内部的字符串数组没问题。 - JohnOpincar

0

你正在尝试将一个数组反序列化为一个 Example 对象。试试将其转为一个 List:

var des = JsonConvert.DeserializeObject(responseString, typeof(List<Example>)) as List<Example>;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接