JSON-объект для целого числа - PullRequest
       18

JSON-объект для целого числа

4 голосов
/ 16 декабря 2008

Глупый вопрос, но я не могу понять ..

Я попробовал следующее в Ruby:

irb(main):020:0> JSON.load('[1,2,3]').class
=> Array

Это похоже на работу. Пока ни

JSON.load('1').class

ни это

JSON.load('{1}').class

работает. Есть идеи?

Ответы [ 6 ]

6 голосов
/ 16 декабря 2008

Я бы спросил парней, которые программировали библиотеку. AFAIK, 1 не является допустимым объектом JSON и не является {1}, но 1 - это то, что сама библиотека генерирует для fixnum 1.

Вам нужно будет сделать: {"number" : 1}, чтобы быть действительным JSON. Баг в том, что

a != JSON.parse(JSON.generate(a))
3 голосов
/ 16 декабря 2008

Я бы сказал, что это ошибка:

>> JSON.parse(1.to_json)
JSON::ParserError: A JSON text must at least contain two octets!
     from /opt/local/lib/ruby/gems/1.8/gems/json-1.1.3/lib/json/common.rb:122:in `initialize'
     from /opt/local/lib/ruby/gems/1.8/gems/json-1.1.3/lib/json/common.rb:122:in `new'
     from /opt/local/lib/ruby/gems/1.8/gems/json-1.1.3/lib/json/common.rb:122:in `parse'
     from (irb):7

Полагаю, вы используете это: (http://json.rubyforge.org/)

2 голосов
/ 13 мая 2016

JSON, поддерживающий только объекты, просто не соответствует действительности - json.org также не предлагает этот imo. он был получен из javascript и, следовательно, особенно строки и числа также действительны в формате JSON:

var json_string = "1";
var p = eval('(' + json_string + ')');
console.log(p);
// => 1
typeof p
// => "number"

ActiveSupport::JSON правильно понимает необработанное значение JSON:

require 'active_support/json'
p = ActiveSupport::JSON.decode '1'
# => 1
p.class
# => Fixnum

и MultiJson :

require 'multi_json'
p = MultiJson.load '1'
# => 1
p.class
# => Fixnum

так что, как упоминалось в a2800276, это должно быть ошибкой.


но на момент написания этой статьи в JSON-файле ruby ​​2 по умолчанию было включено quirks_mode при использовании метода load.

require 'json'
p = JSON.load '1'
# => 1
p.class
# => Fixnum
1 голос
/ 18 августа 2009

Первый пример действителен. Вторые два не являются действительными данными JSON. перейдите на json.org для получения подробной информации.

0 голосов
/ 24 июля 2016

Из самой основы того, что такое JSON:

  • Типы данных в JSON могут быть:
    1. номер
    2. Строка
    3. Json Object ... (и некоторые другие)

Ссылка для просмотра полного списка типов данных Json

  • Теперь любые данные Json должны быть инкапсулированы в 'Json Object' на верхнем уровне.
  • Чтобы понять, почему это так, вы можете видеть, что без объекта Json на верхнем уровне все будет бесполезным, и у вас может быть только один тип данных во всем Json. то есть число, строка, массив, нулевое значение и т. д., но только одно.
  • Тип «Json Object» имеет фиксированный формат пары «ключ»: «значение».
  • Вы не можете хранить только значение. Таким образом, вы не можете иметь что-то вроде {1}. Вам необходимо указать правильный формат, то есть пару «ключ»: «значение».
0 голосов
/ 21 июня 2010

Как уже говорилось, на верхнем уровне JSON допускаются только массивы и объекты.

Возможно, упаковка ваших значений в массив решит вашу проблему.

def set( value ); @data = [value].to_json; end
def get; JSON.parse( @data )[0]; end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...