c# - 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个是空的。
我怎样才能做到这一点?
解决方案
简单的方法是遍历集合并按照注释中的建议检查空字符串或空字符串。更难和丑陋的(对于这种情况)方法是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; }
}
推荐阅读
- r - 根据两个数据框中的列有条件地替换值
- java - 如何在eclipse中自动搜索maven依赖?
- c++ - 在不破坏现有代码的情况下添加新枚举
- python - 使用 python - tkinter 设置根窗口的单一维度的方法?
- json - Ansible 漂亮的打印 json
- .net - 在云端混淆应用程序设置文件,但允许本地应用程序开发
- c - TCL:在嵌入 C 时调用 TCL 包
- javascript - 如何根据设备使 JavaScript 打开页面?
- javascript - 我在 useState 中发现错误了吗?还是我不明白它是如何工作的?
- database - Oracle 18c 的所有服务都没有安装。无法连接到 Sql plus