如何使Rails 3 JSON解析双引号字符串和单个数字

时间:2013-05-30 11:53:53

标签: ruby-on-rails ruby json ruby-on-rails-3 gem

背景

json.org网站上,字符串定义为"char+",其中char+是一个或多个charchar是除"\之外的任何unicode字符。允许控制字符的子集,只是逃避它们:

"foo" "2" "\\"

在Javascript中,如果要解析字符串,则需要将其括起来:

"\"foo\""'"foo"',但不是"'foo'"

在Rails 3中,运行C或纯Ruby代码的JSON gem是默认的。


根据接受的答案,gem解析JSON文档而不是元素。文档可以是键,值(对象/哈希)或值(数组)形式的集合。


问题

字符串

假设我们要解析字符串foo,我们需要将其括在"\"foo\""'"foo"'

JSON.parse("\"foo\"")
JSON.parse('"foo"')

产量

JSON::ParserError unexpected token at '"foo"' 

意味着它无法解析"foo"

数字

数字也是如此:'3'"3"将产生Needs at least two octets。 较大的数字(八位字节是一个字节,因此两个utf8字符是两个字节):'42'"42"只产生相同的JSON::ParserError unexpected token at '42'


解决方法

如果gem位于数组中,它会正确解析这些内容:'["foo"]''[3]'

jsonstring = '"foo"'
JSON.parse( "[#{jsonstring}]" )[0]

产量

"foo"


这太荒谬了。我不正确地理解某事吗?或者这个宝石被窃听了吗?

1 个答案:

答案 0 :(得分:4)

json.org州:

JSON基于两种结构:

  • 名称/值对的集合。在各种语言中,这被实现为对象,记录,结构,字典,哈希表,键控列表或关联数组。

  • 有序的值列表。在大多数语言中,这被实现为数组,向量,列表或序列。

由于"foo"不是上述内容,因此您收到错误消息。为了进一步具体,它看看Ruby JSON Parser,文件说明:

  

要创建有效的JSON文档,您必须确保输出嵌入在JSON数组[]或JSON对象{}中。最简单的方法是将值放在Ruby Array或Hash实例中。

因此,您提到的“解决方法”实际上是使用JSON解析器解析字符串的正确方法。

其他信息:

jsonlint.comjson.parser.online.fr上解析"\"foo\""会引发错误, 解析["foo"]会在两个站点上通过验证测试。