簡體   English   中英

Json.net反序列化,子屬性在空時作為數組出現

[英]Json.net deserialization, child properties that come as an array when empty

我正在與一個可以返回以下JSON結構的Web服務進行通信:

{
    "foo": {
        "bar": "hello world"
    }
}

Foo是可選的,但是我們得到以下內容,而不是值NULL。

{
    "foo": []
}

一個空數組。 我通過在我的模型中使用以下屬性來使用(丑陋的)工作:

public dynamic Foo { get; set; }
public FooModel FooObject {
    get
    {
        if(Foo == null || Foo.GetType().IsArray)
        {
            return null;
        }
        return ((JObject)Foo).ToObject<FooModel>();
    }
}

這適用於這個單一屬性。 但是webservice為所有NULL對象執行此操作。 我正在尋找一種通用的解決方案,在反序列化時忽略所有空數組。 (或者是其他東西)

我一直無法找到解決方案。 我嘗試使用自定義JsonConverter和ContractResolver。

避免問題的一個簡單方法是將JSON預先加載到JToken然后使用擴展方法RemoveEmptyArrayPropertiesWoo commerce json到Dataset或datatable的 答案中刪除所有空數組屬性:

public static class JsonExtensions
{
    public static TJToken RemoveEmptyArrayProperties<TJToken>(this TJToken root) where TJToken : JToken
    {
        var container = root as JContainer;
        if (container == null)
            return root;
        var query = container.DescendantsAndSelf()
            .OfType<JProperty>()
            .Where(p => p.Value is JArray && ((JArray)p.Value).Count == 0);
        foreach (var property in query.ToList())
        {
            property.Remove();
        }

        return root;
    }
}

給定該方法,您可以按如下方式預處理JSON字符串:

var root = JObject.Parse(jsonString)
    .RemoveEmptyArrayProperties()
    .ToObject<RootObject>();

樣本工作.Net小提琴在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM