简体   繁体   English

C# 如何反序列化列表<t>使用 Newtonsoft.Json 的条件</t>

[英]C# How can I deserialize a List<T> with condition using Newtonsoft.Json

I have this classes:我有这个课程:

public class CTest
{
  public int Id { get; set; }
  public string Name { get; set; }
  public List<Class2> Details { get; set; }
}

public class Class2
{
  public int Id { get; set; }
  public int Data1 { get; set; }
}

I know that I can deserialize using JsonConvert.DeserializeObject<T>(myObject);我知道我可以使用JsonConvert.DeserializeObject<T>(myObject);反序列化even Lists, but in Class2 , I'd like to know how to filter if Id > 0 .甚至是列表,但在Class2中,我想知道如何过滤Id > 0

For example, I'd like to get this result:例如,我想得到这个结果:

{
  "id":5,
  "name":"test",
  "details":[
    {
      "id":1,
      "data1":0.25
    }
  ]
}

Instead of:代替:

{
  "id":5,
  "name":"test",
  "details":[
    {
      "id":12,
      "data1":0.25
    },
    {
      "id":0,
      "data1":0.0
    },
  ]
}

You can use Custom JsonConverter您可以使用自定义 JsonConverter

class ListClass2Converter : JsonConverter<List<Class2>>
{
    public override List<Class2> ReadJson(JsonReader reader, Type objectType,
        [AllowNull] List<Class2> existingValue, bool hasExistingValue,
        JsonSerializer serializer)
    {            
        var list = new List<Class2>();

        while (reader.Read() && reader.TokenType != JsonToken.EndArray)
        {
            if (reader.TokenType == JsonToken.StartObject)
            {
                var item = serializer.Deserialize<Class2>(reader);
                if (item.Id != 0)
                    list.Add(item);
            }
        }
        return list;
    }

    public override void WriteJson(JsonWriter writer, [AllowNull] List<Class2> value,
        JsonSerializer serializer)
    {            
        serializer.Serialize(writer, ((List<Class2>)value).Where(c => c.Id != 0).ToArray());
    }
}

Read code阅读代码

var json = File.ReadAllText("test.json");
var сTest = JsonConvert.DeserializeObject<CTest>(json, new ListClass2Converter());

Write code编写代码

var json = JsonConvert.SerializeObject(
    cTest, Formatting.Indented, new ListClass2Converter());

You can use as many converters for different types of collections as you need.您可以根据需要为不同类型的 collections 使用尽可能多的转换器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM