JSON对象只是一个整数

时间:2008-12-16 09:53:29

标签: ruby json

愚蠢的问题,但我无法弄明白......

我在Ruby中尝试了以下内容:

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

这似乎有效。虽然都不是

JSON.load('1').class

也不是这个

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

的工作原理。有什么想法吗?

6 个答案:

答案 0 :(得分:6)

我会问那些编程图书馆的人。 AFAIK,1不是有效的JSON对象,{1}也不是1,而{"number" : 1}是库本身为fixnum 1生成的内容。

你需要做:a != JSON.parse(JSON.generate(a)) 才能成为有效的json。错误是

{{1}}

答案 1 :(得分:3)

我说这是一个错误:

>> 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 :(得分:2)

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所提到的,这肯定是一个错误。

但在撰写本文时,使用quirks_mode方法时,ruby 2的JSON有load enabled by default

require 'json'
p = JSON.load '1'
# => 1
p.class
# => Fixnum

答案 3 :(得分:1)

第一个例子是有效的。后两个不是有效的JSON数据。转到json.org了解详情。

答案 4 :(得分:0)

如上所述,只允许在JSON的顶层使用数组和对象。

将数值包装在数组中可能会解决您的问题。

def set( value ); @data = [value].to_json; end
def get; JSON.parse( @data )[0]; end

答案 5 :(得分:0)

从JSON的基础知识出发:

  • JSON中的数据类型可以是:
    1. 字符串
    2. Json Object ...(还有一些)

Reference to see complete list of Json data types

  • 现在任何Json数据都必须封装在顶层的“Json Object”中。
  • 要理解为什么会如此,你可以看到,如果没有顶层的Json对象,一切都会松动,你只能在整个Json中只有一个数据类型。即数字,字符串,数组,空值等......但只有一个。
  • 'Json Object'类型具有固定格式的'key':'value'对。
  • 您无法仅存储该值。因此,你不能拥有像{1}这样的东西。 您需要输入正确的格式,即“key”:“value”对。