我遇到这样的情况,来自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; }
}
有人对此问题有其他想法/解决方案吗?
答案 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;