Ich entwickle einen API-Client, in dem ich auf Anfrage eine JSON-Nutzlast codieren und einen JSON-Body aus der Antwort decodieren muss.
Ich habe den Quellcode aus mehreren Bibliotheken gelesen und nach dem, was ich gesehen habe, habe ich grundsätzlich zwei Möglichkeiten, eine JSON-Zeichenfolge zu codieren und zu decodieren.
Verwenden Sie die json.UnmarshalÜbergabe der gesamten Antwortzeichenfolge
data, err := ioutil.ReadAll(resp.Body)
if err == nil && data != nil {
err = json.Unmarshal(data, value)
}
oder mit json.NewDecoder.Decode
err = json.NewDecoder(resp.Body).Decode(value)
In meinem Fall io.Readerscheint die zweite Version beim Umgang mit implementierten HTTP-Antworten weniger Code zu erfordern, aber da ich beide gesehen habe, frage ich mich, ob es eine Präferenz gibt, ob ich eine Lösung anstelle der anderen verwenden soll.
Darüber hinaus lautet die akzeptierte Antwort auf diese Frage
Bitte verwenden Sie
json.Decoderanstelle vonjson.Unmarshal.
aber der Grund wurde nicht erwähnt. Sollte ich die Verwendung wirklich vermeiden json.Unmarshal?
ioutil.ReadAllist fast immer das Falsche. Es hängt nicht mit Ihrem Ziel zusammen, erfordert jedoch, dass Sie über genügend zusammenhängenden Speicher verfügen, um alles zu speichern, was möglicherweise über die Pipe kommt, selbst wenn die letzten 20 TB der Antwort nach den letzten }in Ihrem JSON liegen.
io.LimitReader, um dies zu verhindern.