Текст JSON должен содержать не менее двух октетов
я получил эту ошибку, и я не мог найти разумного ответа на этот вопрос, поэтому я решил написать краткое описание проблемы.
если вы запустите этот фрагмент в irb:
JSON.parse( nil )
вы увидите следующую ошибку:
TypeError: can't convert nil into String
Я ожидал, что функция вернется nil, а не TypeError. Если вы преобразуете все входные данные с помощью to_s, тогда вы увидите ошибку октета:
JSON::ParserError: A JSON text must at least contain two octets!
это просто прекрасно и хорошо. Если вы не знаете, что такое октет, прочитайте этот пост для резюме и решение:
Что такое октет JSON и почему требуется два?
решение
переменная, которую вы передаете, является пустой строкой. Не пытайтесь использовать пустую строку в JSON.parse метод.
вопрос
Итак, теперь я знаю причину ошибки, какой шаблон я должен использовать для обработки этого? Я немного ненавижу обезьяны патч библиотеки JSON, чтобы позволить nil ценности. Любые предложения будут с благодарностью.
4 ответов:
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)
согласно json.org
JSON построен на двух структурах:
коллекция пар имя/значение. В различных языках это реализовано как объект, запись, структура, словарь, хэш-таблица, список с ключом или ассоциативный массив.
упорядоченный список значений. В большинстве языков это реализовано как массив, вектор, список или последовательность.
Итак, минимум два октета(8 бит) требуется на верхнем уровне будет
{}или[]ИМО, лучшим решением было бы убедиться, что аргумент
JSON.parse- это либо стригифицированный объект, либо стригифицированный массив. : -)
hash = JSON.parse(json) rescue {} array = JSON.parse(json) rescue [] string = JSON.parse(json) rescue ''
Comments