【问题标题】:JSON serializing and deserializing with special characters with RAILS使用 RAILS 对特殊字符进行 JSON 序列化和反序列化
【发布时间】:2013-11-23 20:21:44
【问题描述】:

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

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

编辑:

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

{"Hu00c9MO":"JOUR"}

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

【问题讨论】:

    标签: ruby-on-rails ruby json serialization


    【解决方案1】:

    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 字符 这就是为什么你可以't 在 id 侧取回“É”。

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

    【讨论】:

    • 就像我在另一个答案中评论的那样,我在数据库中以 JSON 格式对哈希进行编码,但它使用 unicode 转义码保存字符串(这甚至看起来都不好,看起来像缺少\):{“Hu00c9MO”:“JOUR”}所以当我解析它时,é没有被带回来。
    【解决方案2】:

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

    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 的替代品)

    【讨论】:

    • 好点,我认为我的问题不是我想的那样,事实上,我在数据库中以 JSON 格式编码哈希,但它使用 unicode 转义码保存字符串( ' 甚至看起来都不好,看起来 \ 丢失了):{"Hu00c9MO":"JOUR"} 所以当我解析它时,é 没有带回来。
    • 问题是转义 \ 因为没有加倍而被自动删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多