programing

json을 사용하여 JSON을 디코딩하고 있습니다.언마샬 vs json.NewDecoder.디코드

minecode 2023. 3. 26. 12:55
반응형

json을 사용하여 JSON을 디코딩하고 있습니다.언마샬 vs json.NewDecoder.디코드

요청에 따라 JSON 페이로드를 인코딩하고 응답에서 JSON 본문을 디코딩해야 하는 API 클라이언트를 개발 중입니다.

몇 개의 라이브러리에서 소스코드를 읽어 본 결과, 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)

제 경우, 구현된 HTTP 응답을 처리할 때io.Reader두 번째 버전은 코드가 적은 것 같습니다만, 둘 다 본 적이 있기 때문에, 다른 버전보다 솔루션을 사용하는 것이 좋은지 어떤지를 고민하고 있습니다.

게다가질문에서 받아들여진 답변은 다음과 같다.

사용하세요json.Decoder대신json.Unmarshal.

그 이유는 언급되지 않았습니다.정말 사용을 피해야 할까요?json.Unmarshal?

그것은 정말로 당신의 의견이 무엇이냐에 달려있다.의 실장을 보면,Decode의 방법json.DecoderJSON 값을 Go 값으로 변환하기 전에 메모리 내의 모든 JSON 값을 버퍼링합니다.따라서 대부분의 경우 메모리 효율은 향상되지 않습니다(단, 향후 버전의 언어에서는 쉽게 변경될 수 있습니다).

더 나은 경험의 법칙은 다음과 같습니다.

  • 사용하다json.Decoder데이터 전송이 필요한 경우io.Reader스트림 또는 데이터 스트림에서 여러 값을 디코딩해야 합니다.
  • 사용하다json.UnmarshalJSON 데이터가 이미 메모리에 있는 경우.

HTTP 요청을 읽는 경우라면json.Decoder개울물을 읽고 있는 게 분명하니까

바둑 웹 프로그래밍 책에서 이 단락을 찾았습니다.하지만 아무런 설명이 없다.

디코더 대 Unmarshal은 언제 사용할까요?

입력에 따라 다릅니다.데이터가 IO에서 전송되는 경우.리더 스트림(Body of http와 같은)요청, 디코더를 사용합니다.데이터가 문자열 또는 메모리 어딘가에 있는 경우 Unmarshal을 사용합니다.

언급URL : https://stackoverflow.com/questions/21197239/decoding-json-using-json-unmarshal-vs-json-newdecoder-decode

반응형