6

背景

json.org网站上,字符串被定义为"char+"where char+is one 或 more char。A是除orchar之外的任何 unicode 字符。允许使用控制字符的子集,只需将它们转义:"\

"foo" "2" "\\"

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

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

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


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


问题

字符串

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

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

屈服

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

意味着它无法解析"foo"

数字

数字也是如此:'3'or "3"will yield Needs at least two octets。更大的数字(八位字节是一个字节,所以两个 utf8 字符是两个字节):'42'或者"42"简单地产生相同的JSON::ParserError unexpected token at '42'


解决方法

如果它们在数组中,gem 会正确解析这些东西:'["foo"]''[3]'

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

产量

"foo"


这是荒唐的。我没有正确理解某些东西吗?还是这个宝石被窃听了?

4

1 回答 1

4

json.org状态:

JSON 建立在两种结构之上:

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

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

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

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

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

附加信息:

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

于 2013-05-30T12:40:09.733 回答