繁体   English   中英

如何检查 JSON 中的值类型并决定是否反序列化?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM