Текст 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
. Любые предложения были бы с благодарностью.
Ответы
Ответ 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 ''