[英]How to check the value type in a JSON and decide whether to deserialize?
给定以下结构:
"meta": {
"pagination": {
"total": 378,
"count": 50,
"per_page": 50,
"current_page": 2,
"total_pages": 8,
"links": {
"previous": "https://myapi.com.br/api/clients?page=1",
"next": "https://myapi.com.br/api/clients?page=3"
}
}
有时,属性“links”的值作为空数组返回。
"meta": {
"pagination": {
"total": 14,
"count": 14,
"per_page": 50,
"current_page": 1,
"total_pages": 1,
"links": []
}
}
所以我创建了一个从 JsonConverter 继承的类型来设置我的 class 属性。
这是我不知道如何进行的地方。
public class LinksJsonConverter : JsonConverter
{
public override bool CanWrite => false;
public override bool CanConvert(Type objectType)
=> objectType == typeof(Links);
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
var links = new Links();
if (reader.TokenType == JsonToken.StartArray || reader.TokenType == JsonToken.EndArray)
return links; // try return null
JObject jo = JObject.Load(reader);
links.Previous = jo["Previous"]?.ToString() ?? string.Empty;
links.Next = jo["Next"]?.ToString();?? string.Empty;
return links;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
=> ...
}
课程:
public class Links
{
public string Previous { get; set; }
public string Next { get; set; }
}
public class Pagination
{
public int Total { get; set; }
public int Count { get; set; }
[JsonProperty("per_page")]
public int PerPage { get; set; }
[JsonProperty("current_page")]
public int CurrentPage { get; set; }
[JsonProperty("total_pages")]
public int TotalPages { get; set; }
[JsonConverter(typeof(LinksJsonConverter))]
public Links Links { get; set; }
}
当我尝试从空的“链接”属性转换时出现错误。 当值为空数组时:
Message:
Test method IntegrationDownloaderServiceTests.ShouldProcessResultNfe threw exception:
Newtonsoft.Json.JsonSerializationException: Unexpected token when deserializing object:
EndArray. Path 'meta.pagination.links', line 123, position 17.
如何解决这种情况?
在第一步将链接反序列化为 object:
public class Pagination
{
public int total { get; set; }
public int count { get; set; }
public int per_page { get; set; }
public int current_page { get; set; }
public int total_pages { get; set; }
public object links { get; set; }
}
public class Meta
{
public Pagination pagination { get; set; }
}
public class Root
{
public Meta meta { get; set; }
}
然后检查链接类型:( this )
public static class TypeExtensions
{
public static bool IsArrayOf<T>(this Type type)
{
return type == typeof (T[]);
}
}
并决定是否将 object 转换为数组。
我可能对我的问题不够清楚。
我想忽略数组值(至少现在),直到它有意义的那一天。
在这个 API 的文档中,我没有找到关于它的参考资料。
我会尝试联系开发商。
这样它就起作用了:
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartObject)
{
JObject jo = JObject.Load(reader);
var links = new Links
{
Previous = jo["previous"]?.Value<string>() ?? string.Empty,
Next = jo["next"]?.Value<string>() ?? string.Empty
};
return links;
}
else if (reader.TokenType == JsonToken.StartArray)
{
reader.Skip();
}
return null;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.