Десериализация Json.net, дочерние свойства, которые становятся массивом, когда они пусты - PullRequest
0 голосов
/ 05 июня 2018

Я говорю с веб-сервисом, который может вернуть следующую структуру 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>();
    }
}

Это работает для этого единственного свойства.Но веб-сервис делает это для всех объектов, которые имеют значение NULL.Я ищу общее решение, которое игнорирует все пустые массивы при десериализации.(или что-то еще)

Я не смог найти решение.Я попытался использовать пользовательский JsonConverter и ContractResolver.

1 Ответ

0 голосов
/ 06 июня 2018

Один простой способ избежать этой проблемы - предварительно загрузить JSON в JToken, а затем удалить все свойства пустого массива, используя метод расширения RemoveEmptyArrayProperties из этого ответа Woo 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 скрипки здесь .

...