猿问

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

我有一个具有 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 作为流处理,并从这个集合中一个一个地解码结构?


BIG阳
浏览 103回答 1
1回答

素胚勾勒不出你

首先,阅读文档。打包json导入“编码/json”func (*解码器) 解码func (dec *Decoder) Decode(v interface{}) errorDecode 从其输入中读取下一个 JSON 编码值并将其存储在 v 指向的值中。package mainimport (    "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)}
随时随地看视频慕课网APP

相关分类

Go
我要回答