대규모 JSON 페이로드로 작업할 때 메모리의 전체 스트림을 디코딩하는 것은 비효율적이고 비실용적일 수 있습니다. 이 기사에서는 스트리밍되는 JSON을 디코딩하기 위해 json.Decoder를 사용하는 대체 접근 방식을 살펴보겠습니다.
json.Decoder는 디코더를 제공합니다. .Token() 메서드를 사용하면 전체 객체를 소비하지 않고 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!