>백엔드 개발 >Golang >Go에서 대규모 JSON 스트림을 효율적으로 디코딩하려면 어떻게 해야 합니까?

Go에서 대규모 JSON 스트림을 효율적으로 디코딩하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-21 14:01:14899검색

How Can I Efficiently Decode Large JSON Streams in Go?

Go에서 JSON 스트림 디코딩

대규모 JSON 페이로드로 작업할 때 메모리의 전체 스트림을 디코딩하는 것은 비효율적이고 비실용적일 수 있습니다. 이 기사에서는 스트리밍되는 JSON을 디코딩하기 위해 json.Decoder를 사용하는 대체 접근 방식을 살펴보겠습니다.

json.Decoder를 사용한 이벤트 기반 구문 분석

json.Decoder는 디코더를 제공합니다. .Token() 메서드를 사용하면 전체 객체를 소비하지 않고 JSON 스트림에서 다음 토큰을 구문 분석할 수 있습니다. 이를 통해 이벤트 중심 구문 분석이 가능해지며 토큰을 증분적으로 처리하고 상태 머신을 구축하여 JSON 구조 내에서 진행 상황을 추적할 수 있습니다.

증분 JSON 객체 처리를 위한 구현

구현을 살펴보겠습니다. 질문에 설명된 특정 시나리오를 해결합니다.

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

type LargeObject struct {
    Id   string `json:"id"`
    Data string `json:"data"`
}

// Helper error handler
he := func(err error) {
    if err != nil {
        log.Fatal(err)
    }
}

// Parse and process a JSON object stream
func ParseStream(reader io.Reader) {
    dec := json.NewDecoder(reader)

    // Expect an object
    t, err := dec.Token()
    he(err)
    if delim, ok := t.(json.Delim); !ok || delim != '{' {
        log.Fatal("Expected object")
    }

    // Read properties
    for dec.More() {
        t, err = dec.Token()
        he(err)
        prop := t.(string)
        if t != "items" {
            var v interface{}
            he(dec.Decode(&v))
            log.Printf("Property '%s' = %v", prop, v)
            continue
        }

        // "items" array
        t, err := dec.Token()
        he(err)
        if delim, ok := t.(json.Delim); !ok || delim != '[' {
            log.Fatal("Expected array")
        }

        // Read large objects
        for dec.More() {
            lo := LargeObject{}
            he(dec.Decode(&lo))
            fmt.Printf("Item: %+v\n", lo)
        }

        // Array closing delim
        t, err = dec.Token()
        he(err)
        if delim, ok := t.(json.Delim); !ok || delim != ']' {
            log.Fatal("Expected array closing")
        }
    }

    // Object closing delim
    t, err = dec.Token()
    he(err)
    if delim, ok := t.(json.Delim); !ok || delim != '}' {
        log.Fatal("Expected object closing")
    }
}

이 구현은 JSON 개체를 점진적으로 처리하여 속성과 대형 개체를 디코딩합니다. 별도로. he() 함수는 치명적인 종료로 인한 오류를 처리하는 데 사용됩니다.

이 접근 방식을 사용하면 전체 JSON 응답을 메모리에 로드하는 것을 방지함으로써 대규모 페이로드를 효율적으로 처리할 수 있습니다.

위 내용은 Go에서 대규모 JSON 스트림을 효율적으로 디코딩하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.