首页 > 后端开发 > Golang > 如何在 Go 中高效地流式传输和解码大型 JSON 数组?

如何在 Go 中高效地流式传输和解码大型 JSON 数组?

Patricia Arquette
发布: 2024-12-16 02:18:09
原创
830 人浏览过

How to Efficiently Stream and Decode Large JSON Arrays in Go?

流式处理大数据的 JSON 数组

将大量 JSON 数组解码到内存中可能会出现问题,从而导致内存问题。为了解决这个问题,流式传输 JSON 元素是一种更有效的解决方案。

Go 中的encoding/json 包提供了一种逐个流式传输 JSON 数据的机制。这是一个扩展示例:

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "strings"
)

func main() {
    const jsonStream = `
                [
                    {"Name": "Ed", "Text": "Knock knock."},
                    {"Name": "Sam", "Text": "Who's there?"},
                    {"Name": "Ed", "Text": "Go fmt."},
                    {"Name": "Sam", "Text": "Go fmt who?"},
                    {"Name": "Ed", "Text": "Go fmt yourself!"}
                ]
            `

    type Message struct {
        Name, Text string
    }

    dec := json.NewDecoder(strings.NewReader(jsonStream))

    // Read the opening bracket.
    t, err := dec.Token()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%T: %v\n", t, t)

    // Loop through the array elements.
    for dec.More() {
        var m Message

        // Decode the current element.
        err = dec.Decode(&m)
        if err != nil {
            log.Fatal(err)
        }

        fmt.Printf("%v: %v\n", m.Name, m.Text)
    }

    // Read the closing bracket.
    t, err = dec.Token()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%T: %v\n", t, t)
}
登录后复制

在此示例中,我们显式处理 JSON 数组的左括号和右括号并单独解码每个元素,使我们能够高效地流式传输 JSON 数据,而无需内存开销。

以上是如何在 Go 中高效地流式传输和解码大型 JSON 数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板