首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何对可以是数组或单个对象的整个响应进行反序列化?

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

Stack Overflow用户
提问于 2019-10-18 13:24:33
回答 1查看 88关注 0票数 1

我遇到过这样一种情况,来自API的响应既可以包含数组,也可以包含单个项。但是,由于数组响应包含另一个嵌套对象,因此我正在努力解决响应的反序列化问题。以下是可以返回的不同响应(示例)。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "data": {
    "items": [
       {
          "id": 1
       },
       {
          "id": 2
       }
    ]
  }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "data": {
    "id": 1
  }
}

我最初标准化响应的尝试包括创建自定义转换器属性,但问题是您不能向其传递泛型参数。ReadJson的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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>() };
}

下面是表示响应的类,但我得到的错误是泛型不能传递到属性中。在进一步阅读之后,似乎这是设计好的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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; }
}

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

EN

回答 1

Stack Overflow用户

发布于 2019-10-18 14:07:28

有几个如下所示的类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        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; }
        }

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var responseObject = Newtonsoft.Json.JsonConvert.DeserializeObject<Response>(responseString);

要进一步改进对数据元素的访问,请在数据类中包含以下属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public List<Item> ResponseItems
            => Id != null
            ? new List<Item>(new Item[] { new Item { Id = Id} })
            : Items;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58451844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文