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



我使用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列表并逐个处理每个项。

相关内容

  • 没有找到相关文章

最新更新