18 votos

La decodificación de JSON en Golang el uso de json.Deserializar vs json.NewDecoder.Decodificar

Estoy desarrollando una API de cliente donde tengo que codificar un JSON de carga en la solicitud y decodificar un JSON cuerpo de la respuesta.

He leído el código fuente de varias bibliotecas y de lo que he visto, tengo básicamente dos posibilidades para la codificación y decodificación de una cadena JSON.

Uso json.Unmarshal pasando toda la cadena de respuesta

data, err := ioutil.ReadAll(resp.Body)
if err == nil && data != nil {
    err = json.Unmarshal(data, value)
}

o el uso de json.NewDecoder.Decode

err = json.NewDecoder(resp.Body).Decode(value)

En mi caso, cuando se trata de las respuestas HTTP que implementa io.Reader, la segunda versión parece ser requiere menos código, pero desde que he visto, tanto que me pregunto si hay alguna preferencia si debo utilizar una solución en vez de la otra.

Por otra parte, la aceptación de la pregunta de esta respuesta dice

Por favor utilice json.Decoder en lugar de json.Unmarshal.

pero no mencionó la razón. Debo realmente evitar el uso de json.Unmarshal?

22voto

James Henstridge Puntos 10695

Realmente depende de lo que tu entrada. Si usted mira en la aplicación de la Decode método de json.Decoder, búferes todo el JSON valor en la memoria antes de unmarshalling en un Ir de valor. Así, en la mayoría de los casos no será más más eficiente de la memoria (aunque esto podría cambiar en un futuro la versión de la lengua).

Por lo que la mejor regla de oro es esta:

  • Uso json.Decoder si los datos provienen de una io.Reader flujo, o que usted necesita para decodificar varios valores de una secuencia de datos.
  • Uso json.Unmarshal si usted ya tiene los datos JSON en la memoria.

Para el caso de la lectura de una solicitud HTTP, me quedaría json.Decoder ya que estamos, evidentemente, la lectura de un arroyo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: