【问题标题】:Deserialize json one record at a time一次反序列化json一条记录
【发布时间】:2020-01-08 14:14:20
【问题描述】:

我正在处理大型 json 文件,内存是一个问题。我想从文件中一次将一个对象读入内存。这可能吗?

在 ServiceStack.Text 文档中它说有一个使用阅读器/流的 API

但我不知道如何让它发挥作用。文件太大,无法一次性反序列化。 SS可以处理这种情况吗?

谢谢

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    不,你会想要使用像 System.Text.Json Utf8JsonReader 这样的流式 JSON 解析器,这是 System.Text.Json introductory page 上的示例:

    byte[] data = Encoding.UTF8.GetBytes(json);
    Utf8JsonReader reader = new Utf8JsonReader(data, isFinalBlock: true, state: default);
    
    while (reader.Read())
    {
        Console.Write(reader.TokenType);
    
        switch (reader.TokenType)
        {
            case JsonTokenType.PropertyName:
            case JsonTokenType.String:
            {
                string text = reader.GetString();
                Console.Write(" ");
                Console.Write(text);
                break;
            }
    
            case JsonTokenType.Number:
            {
                int value = reader.GetInt32();
                Console.Write(" ");
                Console.Write(value);
                break;
            }
    
            // Other token types elided for brevity
        }
    
        Console.WriteLine();
    }
    

    【讨论】:

    • 如果有人发现它似乎不可能使用 `System.Text.Json` 执行此操作,因为阅读器不接受字节流,必须完全加载字节数组。然而,Newtonsoft JsonTextReader 确实接受流
    • @Guerrilla 恰恰相反——这就是为什么在 ASP.NET Core 中使用 Utf8JsonReader 来处理请求(这就是它首先被构建的原因)。它适用于System.IO.PipelinesReadOnlySequence<byte>ReadOnlySpan<byte> 输入,not 字节数组。跨度和序列不是数组,它们是管道生成的数据的视图。整个System.Text.Json 命名空间是为一个非常特定的场景而构建的,牺牲了易用性来换取性能和最小的内存使用量
    • 谢谢,我正在努力理解。找不到任何简单的反序列化对象的例子
    • @Guerrilla 这是here的回答。
    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多