JSON使用RAILS对特殊字符进行序列化和反序列化

时间:2013-11-11 21:34:56

标签: ruby-on-rails ruby json serialization

我真的觉得有点愚蠢,为了让这个简单的线路工作怎么做,我环顾四周,似乎没有回答真的回答这个问题,任何人都可以告诉我如何序列化和反序列化一些简单的事情:

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

编辑:

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

{"Hu00c9MO":"JOUR"}

似乎字符串不好,我无法从JSON解码后带回é

2 个答案:

答案 0 :(得分:4)

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

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

正如你所看到的,它会引发同样类型的错误。

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

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

docs中所述:

  

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

.to_json只是JSON.generate

的替代方案

答案 1 :(得分:2)

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

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

编辑编辑问题:

Accord http://www.json.org当JSON在对象{id: value}上时,id可以是 任何UNICODE字符除“或\或控制字符 这是为什么你不能在id方面取回“É”。

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