Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#,Json反序列化:避免空字符串数组元素_C#_Json_Deserialization - Fatal编程技术网

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

C#,Json反序列化:避免空字符串数组元素,c#,json,deserialization,C#,Json,Deserialization,我从服务器获得的json数组可以包含空字符串元素。我想在反序列化级别删除它们 { "Highlights":[ "Þingvellir National Park", "Gullfoss Waterfall", "Geysir Geothermal Area", "Laugarvatn","Kerið Crater", "Hveragerði Hot Spring Area", ""

我从服务器获得的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; }
}
公共类测试模型
{
公共列表突出显示{get;set;}
}
我希望如果元素是
string.IsNullOrEmpty(element)==true
,则不将其添加到数组中

在这种情况下,
TestModel.Highlights
数组中反序列化后的元素数应该是6,而不是8,因为其中2个是空的


如何实现这一点?

简单的方法是通过集合进行迭代,并按照注释中的建议检查空字符串或空字符串。 (在这种情况下)更难、更难看的方法是根据以下答案创建一个自定义的
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();
    }
}
类IgnoreEmptyItemsConverter:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
返回objectType.IsAssignableFrom(typeof(List));
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
列表=新列表();
JArray数组=JArray.Load(读卡器);
foreach(数组中的变量obj)
{
//真正的自定义方式(不是真正的通用)
如果(!String.IsNullOrEmpty(obj.ToString()))
{
添加(对象ToObject(序列化程序));
}
}
退货清单;
}
公共覆盖布尔可写
{
获取{return false;}
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
抛出新的NotImplementedException();
}
}
这可以在您的模型中使用,如:

public class RootObject
{
    [JsonConverter(typeof(IgnoreEmptyItemsConverter<string>))]
    public List<string> Highlights { get; set; }
}
公共类根对象
{
[JsonConverter(类型(IgnoreEmptyItemsConverter))]
公共列表突出显示{get;set;}
}

有什么原因不能在之后运行列表并删除null或空元素?这可能比说服正在使用的任何JSON解析器进行动态分析都要简单。这样做没有任何理由或好处,只需在
高亮显示上执行一个简单的Linq
Where(s=>!string.IsNullOrEmpty(s))
实现您自己的
JsonConverter
可能非常困难:)