如何在 Json.NET 尽快检索大文件中的几个值

本文关键字:几个 文件 Json NET 检索 | 更新日期: 2023-09-27 18:30:33

我需要显示一个 Json 文件列表。每个文件都包含一个相当大的对象,需要一段时间才能序列化。总的来说,当我只想显示每个对象的列表时,序列化每个对象的性能影响需要太多时间。该文件看起来有点像这样:

{
    'Name': 'File Name',
    'Version': '1.6',
    'BigLongToSerializeObject': {/* The big object here */}
}

如何在 Json.NET 中尽可能高效地仅从此文件中检索NameVersion

如何在 Json.NET 尽快检索大文件中的几个值

您可以通过自定义协定解析程序自定义反序列化。

创建协定解析程序

class ListContractResolver : DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(
                        Type type, 
                        MemberSerialization memberSerialization)
    {
        var result = base.CreateProperties(type, memberSerialization);
        if(/*type is your type*/)
            result = result.Where(i=>i.PropertyName != "BigLongToSerializeObject")
                           .ToList();
        return result;
    }
}

然后创建用于列表反序列化的序列化程序

 var listSerializer = new JsonSerializer();
 serializer.ContractResolver = new ListContractResolver ();

然后,您可以使用listSerializer对列表进行反序列化,并使用默认序列化程序正常反序列化。

JSON# 有一个非常轻量级的工具,可以让你实现这一点。它将从较大的 JSON 对象中检索嵌入的 JSON:

const string schoolMetadata = @"{ "school": {...";
var jsonParser = new JsonObjectParser();
using (var stream = 
    new MemoryStream(Encoding.UTF8.GetBytes(schoolMetadata))) {
    Json.Parse(_jsonParser, stream, "teachers");
}

在这里,我们从一个更大的"学校"对象中检索一个"教师"对象。