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

5

我真的感觉有点愚蠢,不知道该怎么做才能让这个简单的行工作,我找了很多答案,但似乎没有一个能真正解决这个问题的,有人能告诉我如何对这个简单的东西进行序列化和反序列化吗?

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

编辑:

真正的问题更像是将一个带有é的哈希字符串保存在数据库中,就像这样:

{"Hu00c9MO":"JOUR"}

看起来这个字符串有问题,在从JSON解码后,我无法恢复é字符。

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的一种替代方法)

好的观点,我认为我的问题不是我所想的。事实上,在数据库中以JSON格式编码哈希,但保存的字符串是使用unicode转义代码(甚至看起来都不正确,就像缺少\一样):**{"Hu00c9MO":"JOUR"}**当我解析它时,é就没能被还原回来。 - Nicolas Belley
1
问题出在转义符号\上,因为它没有被双写,所以被自动删除了。 - Nicolas Belley

2

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

您传递给解析器的只是一个值。请尝试类似这样的内容:JSON.parse(["É"].to_json) 或者 JSON.parse({value: "É"}.to_json)

编辑:问题已被编辑:

根据http://www.json.org,当JSON是一个对象{id: value}时,id可以是除了双引号、反斜杠和控制字符以外的任何UNICODE字符,这就是为什么你不能在id中得到"É"的原因。

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


就像我在其他答案中所评论的那样,我正在将哈希编码为JSON格式并保存在数据库中,但它会将字符串保存为Unicode转义码(这看起来甚至不正确,就好像\丢失了):{"Hu00c9MO":"JOUR"}。因此,当我将其解析回来时,é没有被还原。 - Nicolas Belley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接