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

C# Json.net反序列化,空时作为数组出现的子属性,c#,json,json.net,deserialization,json-deserialization,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 ==

我正在与一个可以返回以下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>();
    }
}
公共动态Foo{get;set;}
公共FooModelFooObject{
得到
{
if(Foo==null | | Foo.GetType().IsArray)
{
返回null;
}
return((JObject)Foo.ToObject();
}
}
这适用于此单一属性。但是webservice为所有空对象执行此操作。我正在寻找一种在反序列化时忽略所有空数组的通用解决方案。(或者别的什么)


我还没有找到解决办法。我尝试使用定制的JsonConverter和ContractResolver

避免问题的一个简单方法是将JSON预加载到一个数组中,然后使用扩展方法
removeMptyarrayProperties
从到删除所有空数组属性:

公共静态类JsonExtensions
{
公共静态TJToken RemoveEmptyArrayProperties(此TJToken根),其中TJToken:JToken
{
var container=root作为JContainer;
if(容器==null)
返回根;
var query=container.degenantsandself()
第()类
其中(p=>p.Value为JArray&((JArray)p.Value).Count==0);
foreach(query.ToList()中的var属性)
{
属性。移除();
}
返回根;
}
}
给定该方法,您可以按如下方式预处理JSON字符串:

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

Net fiddle示例。

您是否在此处寻找想法:@asherber是的,我看到了,这将是一个可能的解决方案,但需要将模型中的所有属性更改为数组/列表,并将属性全部放在它们上。不会比我目前的解决方案好多少。另一个可能相关的问题:。但是,如果你说你必须对每一个可能的属性都这样做,包括那些具有原始值的属性,那么接受的答案可能不起作用。或者,将你的JSON预加载到
JToken
中,并使用
removeMptyArrayProperties
from.@dbc,removeMptyArrayProperties起作用了!谢谢。你会回答还是我应该创建一个社区维基答案?
var root = JObject.Parse(jsonString)
    .RemoveEmptyArrayProperties()
    .ToObject<RootObject>();