Декодирование JSON в Golang с помощью json.Unmarshal vs json.Новый декодер.Декодировать
Я разрабатываю клиент API, где мне нужно кодировать полезную нагрузку JSON по запросу и декодировать тело JSON из ответа.
Я прочитал исходный код из нескольких библиотек и из того, что я видел, у меня есть в основном две возможности для кодирования и декодирования строки 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?
2 ответов:
это действительно зависит от того, какой ваш вклад. Если вы посмотрите на реализацию
Decodeметодjson.Decoder, он буферизует все значение JSON в памяти, прежде чем отменить его в значение Go. Поэтому в большинстве случаев он не будет более эффективным для памяти (хотя это может легко измениться в будущей версии языка).так что лучшее правило это:
- использовать
json.DecoderЕсли ваши данные поступают изio.Readerпоток, или вам нужно декодировать несколько значений из потока данных.- использовать
json.Unmarshalесли у вас уже есть данные JSON в памяти.для случая чтения из HTTP-запроса я бы выбрал
json.Decoderпоскольку вы, очевидно, читаете из потока.
мы должны получить [] байт из канала перед декодированием, поэтому чтение из io необходимо при работе с HTTP-соединениями, поэтому я думаю, что две функции равны. Но когда данные сохраняются в памяти, или мы получаем байт [], мы можем использовать
Unmarshalнапрямую, это лучше.The
json.Decoderиспользуется при чтении и записи в HTTP-соединения, WebSockets или файлы.The
json.Unmarshalиспользуется, когда вход [] байт
Comments