요청시 JSON 페이로드를 인코딩하고 응답에서 JSON 본문을 디코딩 해야하는 API 클라이언트를 개발 중입니다.
여러 라이브러리에서 소스 코드를 읽었으며 본 내용에서 JSON 문자열을 인코딩하고 디코딩 할 수있는 두 가지 가능성이 있습니다.
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
합니까?
GitHub 의이 풀 요청은 Unmarshal에 대한 호출을 json.NewDecoder로 대체하여 "JSON 디코딩에서 버퍼를 제거합니다."
—
Matt
사용하기 편리한 입력에 따라 다릅니다. blog.golang.org/json-and-go 는 두 기술을 모두 사용하는 예를 제공합니다.
—
rexposadas
IMO
—
더스틴
ioutil.ReadAll
는 거의 항상 잘못된 일입니다. 목표와 관련이 없지만 마지막 20TB의 응답이 }
JSON 의 마지막 이후 인 경우에도 파이프에서 내려 오는 모든 것을 저장할 수있는 충분한 연속 메모리가 필요합니다 .
@Dustin
—
Inanc Gumus
io.LimitReader
이를 방지하기 위해 사용할 수 있습니다 .