使用Json.net反序列化JSON对象数组

Sha*_* C. 110 c# json.net

我试图使用一个API,使用以下示例结构为他们返回的json

[
   {
      "customer":{
         "first_name":"Test",
         "last_name":"Account",
         "email":"test1@example.com",
         "organization":"",
         "reference":null,
         "id":3545134,
         "created_at":"2013-08-06T15:51:15-04:00",
         "updated_at":"2013-08-06T15:51:15-04:00",
         "address":"",
         "address_2":"",
         "city":"",
         "state":"",
         "zip":"",
         "country":"",
         "phone":""
      }
   },
   {
      "customer":{
         "first_name":"Test",
         "last_name":"Account2",
         "email":"test2@example.com",
         "organization":"",
         "reference":null,
         "id":3570462,
         "created_at":"2013-08-12T11:54:58-04:00",
         "updated_at":"2013-08-12T11:54:58-04:00",
         "address":"",
         "address_2":"",
         "city":"",
         "state":"",
         "zip":"",
         "country":"",
         "phone":""
      }
   }
]
Run Code Online (Sandbox Code Playgroud)

JSON.net可以使用类似以下结构的东西

{
    "customer": {
        ["field1" : "value", etc...],
        ["field1" : "value", etc...],
    }
}
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何让它对提供的结构感到满意.

使用默认的JsonConvert.DeserializeObject(content)会生成正确的Customer数,但所有数据都为null.

在CustomerList(下面)执行某些操作会导致"无法反序列化当前JSON数组"异常

public class CustomerList
{
    public List<Customer> customer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

思考?

Jof*_*ern 174

您可以创建一个新模型来反序列化您的Json CustomerJson:

public class CustomerJson
{
    [JsonProperty("customer")]
    public Customer Customer { get; set; }
}

public class Customer
{
    [JsonProperty("first_name")]
    public string Firstname { get; set; }

    [JsonProperty("last_name")]
    public string Lastname { get; set; }

    ...
}
Run Code Online (Sandbox Code Playgroud)

你可以轻松地反序列化你的json:

JsonConvert.DeserializeObject<List<CustomerJson>>(json);
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 !

文档:序列化和反序列化JSON

  • JsonConvert.DeserializeObject <列表<CustomerJson >>(JSON); 适用于字符串输入. (2认同)

Tyl*_*ong 45

对于那些不想创建任何模型的人,请使用以下代码:

var result = JsonConvert.DeserializeObject<
  List<Dictionary<string, 
    Dictionary<string, string>>>>(content);
Run Code Online (Sandbox Code Playgroud)

  • 这是一个可怕的解决方案.相反,如果您不想创建模型,请使用`var result = JsonConvert.DeserializeObject <Tuple <string,string,string >>(content);` (8认同)
  • 首先,对于不同类型的“ IEnumerable”实现不必要的内存分配(与List &lt;Tuple&gt;相比为3)。其次,您的解决方案包含两个不同的键-每个字典1个。如果多个客户具有相同的名字会怎样?按键上没有区别。您的解决方案不考虑此冲突。 (2认同)
  • @ a11smiles每个客户都是一个单独的字典.因此,即使有多个客户具有相同的名字,也不会有任何问题. (2认同)