c# - 使用 Json.Net 解析 JSON 时如何从 IEnumerables 中删除空值

标签 c# json json.net

我正在使用 Json.Net 将 JSON 解析为我的应用程序逻辑。 问题是我从中获取 JSON 的外部 API 有时在其列表中包含“空”项。 我想在解析时从列表(或任何其他可能具有该值的 IEnumerable)中删除那些“空”项。 我相信解决方案必须使用 JsonConverter,但到目前为止我无法让它工作。

MyData data = new MyData();
Newtonsoft.Json.JsonSerializerSettings settings = new Newtonsoft.Json.JsonSerializerSettings
{
  Converters = new List<JsonConverter>() { new TrimNullListValues() }
};
string jsonString = @"{""ListData"": [{""source"" : 10 , ""target"" : 20, ""Data"" : [{""source"" : 100 , ""target"" : 200}, null]}, null]}";
JsonConvert.PopulateObject(jsonString, data, settings);

MyData 类是这样的:

public class MyData {
  public class MyNestedData
  {
    public int Source;
    public int Target;
    public List<MyNestedData> Data;
  }

  public List<MyNestedData> ListData;
}

我的 JsonConverter (TrimNullListValues) 是这样的:

public class TrimNullListValues : JsonConverter {
  public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  {
    serializer.Serialize(writer, value);
  }

  public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  {
    // Don't really know what to do in here to remove unwanted values
    // From the IEnumerabes
  }

  public override bool CanConvert(Type objectType)
  {
    return objectType.IsGenericType && objectType.GetGenericTypeDefinition() == typeof(List<>);
  }
}

最佳答案

你可以尝试这样的事情:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    JArray array = JArray.Load(reader);
    foreach (JToken item in array.ToList())
    {
        if (item.Type == JTokenType.Null)
            item.Remove();
    }
    object list = Activator.CreateInstance(objectType);
    serializer.Populate(array.CreateReader(), list);
    return list;
}

fiddle :https://dotnetfiddle.net/SESCfZ

关于c# - 使用 Json.Net 解析 JSON 时如何从 IEnumerables 中删除空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38054600/

相关文章:

c# - CommandType.Text 与 CommandType.StoredProcedure

c# - 为什么\b 不匹配使用 .net 正则表达式的单词

c# - 从 Excel 读取值时丢失精度

c# - 无法将扩展 DynamicObject 的类序列化为 JSON 字符串。

javascript - 如果使用angular js的任何属性的所有json值都为null,如何隐藏表列

javascript - [JS]更改多级对象值

c# - 使用 json.net 将 xml 转换为 json

json.net - 在 Json.net 中全局设置 IgnoreSerializedAttribute

json.net - 有没有一种方法可以基于接口(interface)使用 json.net 从 json 填充现有对象

php - 使用格式化为 JSON 响应的 MySQL 和 PHP 创建 REST API