요청시 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
합니까?
답변
실제로 입력 내용에 따라 다릅니다. 의 Decode
메소드 구현을 살펴보면 json.Decoder
Go 값으로 마샬링 해제하기 전에 전체 JSON 값을 메모리에 버퍼링합니다. 따라서 대부분의 경우 메모리 효율성이 향상되지 않습니다 (향후 버전의 언어에서는 쉽게 변경 될 수 있음).
따라서 더 나은 경험 법칙은 다음과 같습니다.
json.Decoder
데이터가io.Reader
스트림에서 나오거나 데이터 스트림에서 여러 값을 디코딩해야하는 경우 사용하십시오 .json.Unmarshal
메모리에 이미 JSON 데이터가있는 경우 사용하십시오 .
HTTP 요청에서 읽는 경우 json.Decoder
분명히 스트림에서 읽는 것이기 때문에 선택 합니다.