为了账号安全,请及时绑定邮箱和手机立即绑定

将非常大的 json 解码为结构数组

将非常大的 json 解码为结构数组

Go
BIG阳 2023-06-01 18:02:47
我有一个具有 REST API 的 Web 应用程序,获取 JSON 作为输入并执行此 JSON 的转换。这是我的代码:func (a *API) getAssignments(w http.ResponseWriter, r *http.Request) {   var document DataPacket   err := json.NewDecoder(r.Body).Decode(&document)   if err != nil {       a.handleJSONParseError(err, w)      return   }   // transformations我得到的 JSON 是结构的集合。外部应用程序使用我的应用程序并向我发送非常大的 json 文件(300-400MB)。一次解码这个 json 需要非常多的时间和内存量。有什么方法可以将这个 json 作为流处理,并从这个集合中一个一个地解码结构?
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

首先,阅读文档。


打包json

导入“编码/json”

func (*解码器) 解码

func (dec *Decoder) Decode(v interface{}) error

Decode 从其输入中读取下一个 JSON 编码值并将其存储在 v 指向的值中。

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 open bracket

    t, err := dec.Token()

    if err != nil {

        log.Fatal(err)

    }

    fmt.Printf("%T: %v\n", t, t)


    // while the array contains values

    for dec.More() {

        var m Message

        // decode an array value (Message)

        err := dec.Decode(&m)

        if err != nil {

            log.Fatal(err)

        }


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

    }


    // read closing bracket

    t, err = dec.Token()

    if err != nil {

        log.Fatal(err)

    }

    fmt.Printf("%T: %v\n", t, t)


}


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信