4

对于如何使这条简单的线路工作,我真的觉得有点愚蠢,我环顾四周,似乎没有答案能真正回答这个问题,谁能告诉我如何序列化和反序列化这么简单的东西:

JSON.parse("É".to_json)
JSON::ParserError: 757: unexpected token at '"\u00e9"'

编辑:

真正的问题更像是在数据库中使用字符串中的 é 保存哈希,如下所示:

{"Hu00c9MO":"JOUR"}

看来字符串不好,从JSON解码后无法带回é

4

2 回答 2

4

我认为问题不在于"É". 我刚试过这个:

JSON.parse("A".to_json)
JSON::ParserError: 757: unexpected token at '"A"'

如您所见,它会引发相同类型的错误。

这里的问题是单个字符串 "É"不是有效的 JSON,即使您可以使用to_json它来序列化它,当您尝试解析它时,它也会挂起。试试这个例如:

JSON.parse({'key' => 'É'}.to_json)

文档中所述:

JSON.generate 只允许将对象或数组转换为 JSON 语法。然而,to_json 接受许多 Ruby 类,即使它只是作为序列化的一种方法

.to_json只是替代品JSON.generate

于 2013-11-11T21:50:56.747 回答
2

根据http://www.json.org/ JSON应该是一个对象{id: value}或者一个数组[value1, value2]

您传递的只是一个值。尝试类似:JSON.parse(["É"].to_json)JSON.parse({value: "É"}.to_json)

编辑问题已编辑:

Accord http://www.json.org当 JSON 在 object 上时{id: value},id 可以是除 " 或 \ 或控制字符之外的任何 UNICODE 字符这就是您无法在 id 侧取回 "É" 的原因。

也许解决方案是在保存到 DB 之前用另一个有效字符替换“\”,并在从 DB 读取它时进行反向替换,或者只是用“\”转义“\”。

于 2013-11-11T21:50:28.370 回答