[json] json.Unmarshal과 json.NewDecoder.Decode를 사용하여 JSON 디코딩

요청시 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.DecoderGo 값으로 마샬링 해제하기 전에 전체 JSON 값을 메모리에 버퍼링합니다. 따라서 대부분의 경우 메모리 효율성이 향상되지 않습니다 (향후 버전의 언어에서는 쉽게 변경 될 수 있음).

따라서 더 나은 경험 법칙은 다음과 같습니다.

  • json.Decoder데이터가 io.Reader스트림에서 나오거나 데이터 스트림에서 여러 값을 디코딩해야하는 경우 사용하십시오 .
  • json.Unmarshal메모리에 이미 JSON 데이터가있는 경우 사용하십시오 .

HTTP 요청에서 읽는 경우 json.Decoder분명히 스트림에서 읽는 것이기 때문에 선택 합니다.


답변