リクエストに応じてJSONペイロードをエンコードし、レスポンスからJSONボディをデコードする必要があるAPIクライアントを開発しています。
私はいくつかのライブラリからソースコードを読みましたが、私が見たものから、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
場合、2番目のバージョンは必要なコードが少ないようですが、両方を見たことがあるので、他のソリューションではなくソリューションを使用するかどうかに好みがあるかどうか疑問に思います。
さらに、この質問から受け入れられた答えは言う
の
json.Decoder
代わりに使用してくださいjson.Unmarshal
。
理由は述べられていません。私は本当に使用を避けるべきjson.Unmarshal
ですか?
GitHubでのこのプルリクエストにより、Unmarshalへの呼び出しがjson.NewDecoderに置き換えられ、「JSONデコードでバッファが削除されました」。
—
Matt
それは、どの入力がより使いやすいかに依存します。blog.golang.org/json-and-goは、両方の手法の使用例を示しています。
—
rexposadas 2014年
IMO、
—
ダスティン
ioutil.ReadAll
あるほとんど常に行うには間違ったこと。それはあなたの目標とは関係ありませんが、最後の20TBの応答が}
JSONの最後の応答の後であっても、パイプを下りてくる可能性があるものを格納するのに十分な連続メモリが必要です。
@Dustinこれ
—
Inanc Gumus
io.LimitReader
を防ぐために使用できます。