C#,Json反序列化:避免空字符串数组元素
我从服务器获得的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", ""
{
"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解析器进行动态分析都要简单。这样做没有任何理由或好处,只需在高亮显示上执行一个简单的LinqWhere(s=>!string.IsNullOrEmpty(s))
实现您自己的JsonConverter
可能非常困难:)