首页 > 解决方案 > C#、Json反序列化:避免空字符串数组元素

问题描述

我从服务器传来的 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个是空的。

我怎样才能做到这一点?

标签: c#jsondeserialization

解决方案


简单的方法是遍历集合并按照注释中的建议检查空字符串或空字符串。更难和丑陋的(对于这种情况)方法是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; }
}

推荐阅读