Подтвердить что ты не робот

Текст JSON должен содержать по крайней мере два октета

Я получил эту ошибку, и я не мог найти разумного ответа на этот вопрос, поэтому я подумал, что напишу резюме проблемы.

Если вы запустите этот фрагмент в irb:

JSON.parse( nil )

Вы увидите следующую ошибку:

TypeError: can't convert nil into String

Я ожидал возвращения функции nil, а не a TypeError. Если вы преобразуете все входные данные с помощью to_s, вы увидите ошибку октета:

JSON::ParserError: A JSON text must at least contain two octets!

Это просто отлично и хорошо. Если вы не знаете, что такое октет, прочитайте этот пост для сводки и решения: Что такое октет JSON и почему требуется два?

Решение

Переменная, которую вы передаете, представляет собой пустую строку. Не пытайтесь использовать пустую строку в методе JSON.parse.

Вопрос

Итак, теперь я знаю причину ошибки, какой шаблон я должен использовать для этого? Я немного ненавижу, чтобы обезьяна заплатила библиотеку JSON, чтобы разрешить значения nil. Любые предложения были бы с благодарностью.

4b9b3361

Ответ 1

parsed = json && json.length >= 2 ? JSON.parse(json) : nil

Но на самом деле библиотека должна иметь возможность обрабатывать этот случай и возвращать нуль. Веб-браузеры со встроенной поддержкой JSON, похоже, работают так, как вы ожидаете.


Или сделать это с помощью только слегка интрузивного мини-патча:

module JSON
  def self.parse_nil(json)
    JSON.parse(json) if json && json.length >= 2
  end
end

parsed = JSON.parse_nil(json)

Ответ 2

Согласно json.org

JSON построен на двух структурах:

  • Коллекция пар имя/значение. На разных языках это реализуется как объект, запись, структура, словарь, хеш-таблица, список ключей или ассоциативный массив.

  • Упорядоченный список значений. В большинстве языков это реализуется как массив, вектор, список или последовательность.

Итак, минимум двух октетов (8 бит), требуемых на верхнем уровне, будет {} или []

IMO, лучшим решением было бы убедиться, что аргумент JSON.parse является либо строгим объектом, либо строгим массивом.: -)

Ответ 3

data.presence && JSON.parse(data)

JSON.parse(data.presence || '{}')

Ответ 4

hash = JSON.parse(json) rescue {}
array = JSON.parse(json) rescue []
string = JSON.parse(json) rescue ''