Json.net反序列化,子属性在空时作为数组出现

时间:2018-06-05 14:22:44

标签: c# json json.net deserialization json-deserialization

我正在讨论一个可以返回以下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。

1 个答案:

答案 0 :(得分:1)

避免此问题的一种简单方法是将JSON预加载到JToken,然后使用从this answer {的扩展方法RemoveEmptyArrayProperties删除所有空数组属性{3}}

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小提琴Woo commerce json to Dataset or datatable