使用自定义JsonConverter自定义列表读取

时间:2014-05-29 16:40:56

标签: c# json json.net

我正在使用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();
    }

1 个答案:

答案 0 :(得分:1)

说实话,我不确定你是否真的通过在这里使用JsonConverter进行过滤获得了很多。除非您的JSON非常庞大并且您担心内存消耗,否则获取所需内容的最简单方法是正常反序列化列表,然后在事后对其进行过滤。只需一行代码即可完成:

List<PriceItem> list = JsonConvert.DeserializeObject<List<PriceItem>>(json)
                                  .Where(item => IsNameValid(item.name))
                                  .ToList();

如果您担心内存,请参阅this answer,其中显示了如何从流中逐步反序列化JSON列表并逐个处理每个项目。