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

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

我正在与一个可以返回以下 JSON 结构的网络服务对话:

{
    "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>();
    }
}

这适用于单个属性。但是 web 服务对所有为 NULL 的对象执行此操作。我正在寻找一种在反序列化时忽略所有空数组的通用解决方案。 (或其他)

我还没有找到解决方案。我尝试研究使用自定义 JsonConverter 和 ContractResolver。

最佳答案

避免该问题的一种简单方法是将 JSON 预加载到 JToken 中。然后使用扩展方法 RemoveEmptyArrayPropertiesthis answer 中删除所有空数组属性给 Woo commerce json to Dataset or 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 fiddle here .

关于c# - Json.net反序列化,子属性为空时作为数组出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50702505/

相关文章:

c# - Json.NET 中每个树节点序列化前后的自定义代码

C# 注入(inject) : How to bind to method async

c# - 如何在Xamarin Forms中查看 'customized'?

c# - 从数组偏移量中获取连续的 n 个值

java - Spring Boot 2.2.3及以上版本的Jackson转换问题

javascript - Angular 2 匹配/合并/推送和更新 Json

c# - 如何在C#中搜索#之间的字符,但不要将#与&#60组合使用

java - 使用 JSON-Simple 的 JSON 解析不起作用

c# - JsonSchemaGenerator 字符串的自定义 ContractResolver

c# - 将 JsonConverterFactory 添加到 Blazor Webassembly 应用程序