Декодирование 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?

733   2  

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

    Ничего не найдено.