我正在使用Json.Net,我想反序列化一个如下所示的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,但我不知道如何编写List 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();
}
答案 0 :(得分:1)
说实话,我不确定你是否真的通过在这里使用JsonConverter
进行过滤获得了很多。除非您的JSON非常庞大并且您担心内存消耗,否则获取所需内容的最简单方法是正常反序列化列表,然后在事后对其进行过滤。只需一行代码即可完成:
List<PriceItem> list = JsonConvert.DeserializeObject<List<PriceItem>>(json)
.Where(item => IsNameValid(item.name))
.ToList();
如果您担心内存,请参阅this answer,其中显示了如何从流中逐步反序列化JSON列表并逐个处理每个项目。