我使用Json。我想反序列化一个json List,如下所示:
[
{ "name":"blabla", "price":"50" },
{ "name":"blabla", "price":"50" },
...
]
所以我做了
List<PriceItem> list = JsonConvert.DeserializeObject<List<PriceItem>>(json, new DictionnaryJsonConverter());
但是我想在这一行中只反序列化具有特定名称的项目,基本上有一个函数isNameValid(string name)
,如果返回true,则将项目放入列表中,如果返回false,则将其删除
我可以在第二次读取中进行计算,但我需要在这个函数上有良好的性能。
我试图做一个自定义的JsonConverter像这样,但我不知道如何编写列表ReadJson函数
public class CustomJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
if (objectType == typeof(PriceItem))
{
return true;
}
else if (objectType == typeof(List<PriceItem>))
{
return true;
}
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
Object obj = new Object();
if (objectType == typeof(PriceItem) )
{
obj = new PriceItem();
((PriceItem)obj).Name = reader.ReadAsString();
((PriceItem)obj).Price = reader.ReadAsString();
}
else if (objectType == typeof(List<PriceItem>))
{
// ?????
}
return obj;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
老实说,我不确定在这里使用JsonConverter
进行过滤是否真的能获得多少好处。除非JSON非常庞大,并且担心内存消耗,否则获得所需数据的最简单方法是正常反序列化列表,然后在事后对其进行过滤。只需要一行代码:
List<PriceItem> list = JsonConvert.DeserializeObject<List<PriceItem>>(json)
.Where(item => IsNameValid(item.name))
.ToList();
如果您担心内存问题,那么请参阅这个答案,它展示了如何从流中逐步反序列化JSON列表并逐个处理每个项。