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

106   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 ''
    Ничего не найдено.

Добавить ответ:
Отменить.