C#,Json反序列化:避免空字符串数组元素

时间:2018-11-06 18:26:19

标签: c# json deserialization

来自服务器的我的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 :(得分:1)

最简单的方法是遍历集合,并按照注释中的建议检查null或空字符串。 较难且丑陋的方法(针对这种情况)是根据this答案创建自定义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; }
}