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

482   4  

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 построен на двух структурах:

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

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

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

ИМО, лучшим решением было бы убедиться, что аргумент JSON.parse - это либо стригифицированный объект, либо стригифицированный массив. : -)

data.presence && JSON.parse(data)

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

Comments

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