C #, десериализация Json: избегать пустых элементов массива строк - PullRequest
0 голосов
/ 06 ноября 2018

Мой массив json, который приходит ко мне с сервера, может содержать пустые строковые элементы. Я хочу удалить их на уровне десериализации.

{
   "Highlights":[
         "Þingvellir National Park",
         "Gullfoss Waterfall",
         "Geysir Geothermal Area",
         "Laugarvatn","Kerið Crater",
         "Hveragerði Hot Spring Area",
         "",
         ""
   ]
}

Модель:

public class TestModel
{
    public List<string> Highlights { get; set; }
}

Я хочу, чтобы, если элемент был string.IsNullOrEmpty (element) == true, то он не добавлялся в массив.

В этом случае количество элементов после десериализации в массиве TestModel.Highlights должно быть 6, а не 8, поскольку 2 из них пусты.

Как мне этого добиться?

1 Ответ

0 голосов
/ 06 ноября 2018

Простой способ - выполнить итерацию по коллекции и проверить наличие нулевых или пустых строк, как это предлагается в комментариях. Более сложным и уродливым (для этой ситуации) способом было бы создание пользовательского JsonConverter на основе этого ответа, например:

class IgnoreEmptyItemsConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType.IsAssignableFrom(typeof(List<T>));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        List<T> list = new List<T>();
        JArray array = JArray.Load(reader);
        foreach (var obj in array)
        {
            // really custom way (not really generic)
            if (!String.IsNullOrEmpty(obj.ToString()))
            {
                list.Add(obj.ToObject<T>(serializer));
            }
        }
        return list;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

, и это может быть использовано в вашей модели как:

public class RootObject
{
    [JsonConverter(typeof(IgnoreEmptyItemsConverter<string>))]
    public List<string> Highlights { get; set; }
}
...