1. ホーム

[解決済み】json.Unmarshalとjson.NewDecoder.Decodeを使ったJSONのデコードについて

2022-04-20 16:14:15

質問

APIクライアントを開発しているのですが、リクエスト時にJSONペイロードをエンコードし、レスポンスからJSONボディをデコードする必要があります。

いくつかのライブラリのソースコードを読みましたが、私が見たところ、JSON文字列のエンコードとデコードには、基本的に2つの可能性があります。

使用方法 json.Unmarshal 応答文字列全体を渡す

data, err := ioutil.ReadAll(resp.Body)
if err == nil && data != nil {
    err = json.Unmarshal(data, value)
}

または json.NewDecoder.Decode

err = json.NewDecoder(resp.Body).Decode(value)

私の場合、HTTPレスポンスを処理する際に io.Reader しかし、私は両方を見たので、私は他のソリューションではなく、どちらかを使用するべきかどうか、何か好みがあるのでしょうか。

さらに この質問に対する回答は は言う。

をご利用ください。 json.Decoder の代わりに json.Unmarshal .

が、その理由については書かれていませんでした。の使用は本当に避けるべきでしょうか? json.Unmarshal ?

解決方法は?

それは、あなたの入力が何であるかに本当に依存します。 の実装を見てみると Decode メソッドの json.Decoder の場合、Goの値にアンマーシャルする前に、JSONの値全体をメモリにバッファリングします。 そのため、ほとんどの場合、メモリ効率は上がりません(ただし、これは言語の将来のバージョンで簡単に変更される可能性があります)。

ですから、より良い経験則はこうです。

  • 使用する json.Decoder からのデータである場合 io.Reader ストリームから複数の値をデコードする必要がある場合などです。
  • 使用方法 json.Unmarshal は、すでにJSONデータをメモリ上に持っている場合です。

HTTPリクエストから読み込む場合、私なら json.Decoder 明らかにストリームから読み込んでいるので。