C# 如何使用 Newtonsoft.Json 反序列化列表 <T> 的条件
C# How can I deserialize a List<T> with condition using Newtonsoft.Json
我有这个类:
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; }
}
我知道我可以使用 JsonConvert.DeserializeObject<T>(myObject);
甚至列表进行反序列化,但是在 Class2
中,我想知道如果 Id > 0[=26= 如何进行过滤].
例如,我想得到这个结果:
{
"id":5,
"name":"test",
"details":[
{
"id":1,
"data1":0.25
}
]
}
而不是:
{
"id":5,
"name":"test",
"details":[
{
"id":12,
"data1":0.25
},
{
"id":0,
"data1":0.0
},
]
}
您可以使用Custom 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());
}
}
阅读代码
var json = File.ReadAllText("test.json");
var сTest = JsonConvert.DeserializeObject<CTest>(json, new ListClass2Converter());
编写代码
var json = JsonConvert.SerializeObject(
cTest, Formatting.Indented, new ListClass2Converter());
您可以根据需要为不同类型的集合使用任意数量的转换器。
我有这个类:
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; }
}
我知道我可以使用 JsonConvert.DeserializeObject<T>(myObject);
甚至列表进行反序列化,但是在 Class2
中,我想知道如果 Id > 0[=26= 如何进行过滤].
例如,我想得到这个结果:
{
"id":5,
"name":"test",
"details":[
{
"id":1,
"data1":0.25
}
]
}
而不是:
{
"id":5,
"name":"test",
"details":[
{
"id":12,
"data1":0.25
},
{
"id":0,
"data1":0.0
},
]
}
您可以使用Custom 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());
}
}
阅读代码
var json = File.ReadAllText("test.json");
var сTest = JsonConvert.DeserializeObject<CTest>(json, new ListClass2Converter());
编写代码
var json = JsonConvert.SerializeObject(
cTest, Formatting.Indented, new ListClass2Converter());
您可以根据需要为不同类型的集合使用任意数量的转换器。