我遇到过这样一种情况,来自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; }
}
有人对这个问题有其他想法/解决方案吗?
发布于 2019-10-18 14:07:28
有几个如下所示的类:
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);
要进一步改进对数据元素的访问,请在数据类中包含以下属性:
public List<Item> ResponseItems
=> Id != null
? new List<Item>(new Item[] { new Item { Id = Id} })
: Items;
https://stackoverflow.com/questions/58451844
复制相似问题