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

Der*_*Jan 6 ruby gem json ruby-on-rails ruby-on-rails-3

背景

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

"foo" "2" "\\"

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

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

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


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


问题

字符串

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

JSON.parse("\"foo\"")
JSON.parse('"foo"')
Run Code Online (Sandbox Code Playgroud)

JSON::ParserError unexpected token at '"foo"' 
Run Code Online (Sandbox Code Playgroud)

意思是它无法解析 "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]
Run Code Online (Sandbox Code Playgroud)

产量

"foo"
Run Code Online (Sandbox Code Playgroud)


这是荒唐的.我不正确地理解某事吗?或者这个宝石被窃听了吗?

Ana*_*hah 4

json.org指出:

JSON 建立在两种结构之上:

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

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

由于"foo"以上都不是,因此您会收到错误消息。为了更具体,请查看Ruby JSON Parser,文档指出:

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

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

附加信息:

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

  • 对于数字等也是如此。 (2认同)