요청시 JSON 페이로드를 인코딩하고 응답에서 JSON 본문을 디코딩해야하는 API 클라이언트를 개발 중입니다.json.Unmarshal 대 json.NewDecoder.Decode를 사용하여 Golang의 JSON 디코딩
여러 라이브러리에서 소스 코드를 읽었으며 필자가 본 것부터는 JSON 문자열을 인코딩하고 디코딩하는 데 기본적으로 두 가지 가능성이 있습니다. 전체 응답 문자열
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)
를 사용하여 전달
사용 json.Unmarshal
, 두 번째 버전은 적은 코드를 필요로 할 것, io.Reader
를 구현 HTTP 응답을 처리 할 때 그러나 두 가지 모두를 보았으므로 내가 아닌 다른 솔루션을 사용해야하는지에 대한 선호가 있는지 궁금합니다.
또한, the accepted answer from this question는
이
json.Decoder
대신json.Unmarshal
사용하십시오 말한다.
그러나 그 이유는 언급하지 않았습니다. json.Unmarshal
을 사용하지 않는 것이 좋습니다.
이 [GitHub의 당겨 요청 (https://github.com/codegangsta/martini-contrib/pull/84) 인 경우에 사용된다 정렬 화를 호출 대체 json.NewDecoder는 "JSON 디코딩에서 버퍼를 제거합니다." – Matt
그것은 단지 당신이 사용하기에 더 편리한 입력에 달려 있습니다. http://blog.golang.org/json-and-go에는 두 가지 기술을 모두 사용하는 예가 나와 있습니다. – rexposadas
IMO,'ioutil.ReadAll'은 * 거의 * 항상 잘못된 행동입니다.그것은 당신의 목표와 관련이 없지만 JSON의 마지막 20TB가 마지막'}'이후에 있더라도 파이프를 내려갈 수있는 것을 저장하기에 충분한 인접 메모리가 필요합니다. – Dustin