c# - 反序列化来自 Json Http 响应的对象列表

标签 c# json serialization deserialization httpresponse

我有这样的 JSON 响应:

{
  "Adddress": [
    {
      "Country": "United States",
      "City": "Irmo",
      "Line1": "103 Kinley Rd",
      "Line2": null,
      "PostalCode": "20063",
      "State": "SC",
      "AddressCode": "BILL-01"
    },
    {
      "Country": "United States",
      "City": "Irmo",
      "Line1": "1098 Kanley Road",
      "Line2": "Building B",
      "PostalCode": "29063",
      "State": "SC",
      "AddressCode": "SHIP-01"
    }]
}

这是我的地址类:

 [JsonObject()]
    public class Address
    {
        public string AddressCode { get; set; }
        public string Line1 { get; set; }
        public string Line2 { get; set; }
        public string Country { get; set; }
        public string State { get; set; }
        public string PostalCode { get; set; }
        public string City { get; set; }
    }

我有这个 C# 代码来反序列化这个对我的对象列表的 http 响应:

HttpResponseMessage response = client.GetAsync(urlParameters).Result;  // Blocking call!
if (response.IsSuccessStatusCode)
{
    var dataObjects = response.Content.ReadAsAsync<Adddress>().Result;//JsonConvert.DeserializeObject<List<RestResponse>>(response.Content.ReadAsStringAsync().Result);//
    foreach (var d in dataObjects)
    {
        Console.WriteLine("{0}", d.Country);
    }
}

但是我收到了这个错误:

Additional information: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.IEnumerable`1[TestREST.Program+RestResponse]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.

Path 'RestResponse', line 2, position 19.

我应该如何处理它才能使我的反序列化工作正常进行?

最佳答案

Address 是单一的,你得到的 json 是一个地址数组 (所以不止一个),你必须将它反序列化为例如AddressList 包含多个地址

string json = "{\"Adddress\":[{\"Country\":\"United States\",\"City\":\"Irmo\",\"Line1\":\"103 Kinley Rd\",\"Line2\":null,\"PostalCode\":\"20063\",\"State\":\"SC\",\"AddressCode\":\"BILL - 01\"},{\"Country\":\"United States\",\"City\":\"Irmo\",\"Line1\":\"1098 Kanley Road\",\"Line2\":\"Building B\",\"PostalCode\":\"29063\",\"State\":\"SC\",\"AddressCode\":\"SHIP - 01\"}]}";

 var dataObjects = JsonConvert.DeserializeObject<AddressList>(json);
 foreach (var d in dataObjects.Adddress)
 {
     Console.WriteLine("{0}", d.Country);
 }

类:

public class Adddress
{
    [JsonProperty("Country")]
    public string Country { get; set; }

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

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

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

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

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

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

public class AddressList
{
    [JsonProperty("Adddress")]
    public IList<Adddress> Adddress { get; set; }
}

关于c# - 反序列化来自 Json Http 响应的对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39797387/

相关文章:

java - JSON 处理linkedHashMap

json - 解析和生成 JSON

c++ - 用于定位对象的序列化和数据库技术

java - JSON对象映射器: avoid listing derived class in serialized JSON string

serialization - Doctrine 数组列与自定义序列化相比的优点?

python - 我如何先读取二进制 pickle 数据,然后再对其进行 unpickle?

C# DotLiquid 简单示例单元测试未按预期工作

c# - 如何使用 MS EWS Managed API 检索全局联系人?

c# - 在 Entity Framework 中使用 'using' 语句的正确方法

c# - 不可捕获的异常