如何反序列化可能是数组或单个对象的整个响应?

时间:2019-10-18 13:24:32

标签: c# .net json json.net deserialization

我遇到这样的情况,来自API的响应可以包含数组或单个项目。但是,由于数组响应包含另一个嵌套对象,因此我在响应的反序列化方面感到很挣扎。这是可以返回的不同响应(示例)。

这是返回项目列表时的响应格式

{
  "data": {
    "items": [
       {
          "id": 1
       },
       {
          "id": 2
       }
    ]
  }
}

这是返回单个项目时发送的响应

{
  "data": {
    "id": 1
  }
}

我最初使响应标准化的尝试包括创建自定义转换器属性,但是存在的问题是您无法将通用参数传递给它。 ReadJson的代码如下:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    JToken token = JToken.Load(reader);
    if(token["items"]?.Type == JTokenType.Array)
    {
        return token["items"].ToObject<T>();
    }

    return new List<T>() { token.ToObject<T>() };
}

这里是代表响应的类,但是我得到一个错误,即泛型无法传递到属性中。在进一步阅读之后,似乎这是设计使然。

public  class Response<T>
{
    [JsonProperty("version")]
    public string Version { get; set; }

    [JsonConverter(SingleOrArrayConverter<T>)]
    public T Data { get; set; }

    [JsonProperty("_links")]
    public Links Links { get; set; }
}

有人对此问题有其他想法/解决方案吗?

1 个答案:

答案 0 :(得分:0)

具有如下几类:

        public class Response
        {
            [JsonProperty("data")]
            public Data ResponseData { get; set; }
        }
        public class Data
        {
            [JsonProperty("id",NullValueHandling = NullValueHandling.Ignore)]
            public long? Id { get; set; }
            [JsonProperty("items", NullValueHandling = NullValueHandling.Ignore)]
            public List<Item> Items { get; set; }
        }
        public class Item
        {
            public long? Id { get; set; }
        }

然后反序列化响应,如下所示:

var responseObject = Newtonsoft.Json.JsonConvert.DeserializeObject<Response>(responseString);

要进一步改善对数据元素的访问,请将下面的属性包括在Data类中:

public List<Item> ResponseItems
            => Id != null
            ? new List<Item>(new Item[] { new Item { Id = Id} })
            : Items;