【问题标题】:Convert JSON string to hash将 JSON 字符串转换为哈希
【发布时间】:2016-01-12 05:32:13
【问题描述】:

我有一个 Ruby on Rails JSON 问题。

我有一个奇怪的错误。我有以下 JSON 字符串,我从外部 API 获得这样的字符串

test = "[{'domain': 'abc.com'}, {'domain': 'def.com'}, {'domain': 'ghi.com'}]"

现在,我想使用以下方法将此字符串转换为哈希:

hash = JSON.parse test

问题在于它会出错:

JSON::ParserError: 419: unexpected token at '{'domain': 'abc.com'}, {'domain': 'def.com'}, {'domain': 'ghi.com'}]'

如果任何字符串包含 ' 或 ",现在仅将 ' 替换为 " 是很危险的。谁有解决办法?

【问题讨论】:

  • 你可以做JSON.parse test.gsub("'", '"')。这将删除所有的单引号,然后解析字符串
  • 我从外部 API 获取此 JSON,因此您的解决方案可能是最好的方法。谢谢!
  • 但是,如果 json 值中有 ' 或 '"' 可能会出现问题,将所有 ' 替换为 " 可以破坏 json....任何人都有解决方案?

标签: ruby-on-rails ruby


【解决方案1】:

这很可能是因为这不是有效的 JSON。将单引号更改为双引号,如下所示:

test = '[{"domain": "abc.com"}, {"domain": "def.com"}, {"domain": "ghi.com"}]'

解释可以在here找到,你可以验证你的JSONhere

【讨论】:

  • 问题是我从外部 API 得到它。有没有一种安全的方法可以将它“转换”为真正的 JSON?只是替换'是危险的。
  • 你说的“只是替换'”是危险的。不幸的是,没有很好的方法来做到这一点。我强烈建议给 API 提供商发电子邮件(或者如果他们设置了一些这样的系统,则提交问题)并告诉他们他们的 API 与所有严格的 JSON 解析器不兼容(可能包括 Ruby、Java、Python、PHP、.NET ——除了在 JavaScript 运行时调用 eval 之外的所有内容,任何理智的开发人员都不会愿意冒险)。
  • 我用JSON.parse test.gsub("{'", '{"').gsub("':'", '":"').gsub("' : '", '":"').gsub("' :'", '":"').gsub("': '", '":"').gsub("'}", '"}').gsub("':", '":').gsub(", '", ',"').gsub(",'", ',"').gsub("' ,", '",').gsub("',", '",').gsub("u'", '"').gsub("']", '"]').gsub("['", '["')解决了它(丑陋的修复应该很安全)
  • 这很难看,老实说不应该用作生产解决方案。我同意 Jordan 的观点:与提供 API 的人交谈。他们有责任创造他们的用户可以消费的东西(目前还没有这样做)。这是商业 API 吗?
【解决方案2】:

您收到错误消息,因为您的字符串不是有效的 JSON。在 JSON 中,所有属性名称都必须用双引号括起来,字符串值也必须用双引号括起来。单引号永远无效。

test = '[{"domain": "abc.com"}, {"domain": "def.com"}, {"domain": "ghi.com"}]'
JSON.parse(test)
# => [ { "domain" => "abc.com" },
#      { "domain" => "def.com" },
#      { "domain" => "ghi.com" } ]

【讨论】:

    【解决方案3】:

    使用Rails 4或以上,如果你想有符号键而不是字符串键,你可以使用deep_symbolize_keys方法

    hash = JSON.parse(test).deep_symbolize_keys
    

    另外,真正的问题是 MyCah 提到的无效 json。

    【讨论】:

      【解决方案4】:

      使用这段代码。你缺少 ActiveSupport::JSON

        ActiveSupport::JSON.decode json_string
      

      【讨论】:

      • 试过了:hash = ActiveSupport::JSON.decode test。同样的错误,对不起。
      猜你喜欢
      • 1970-01-01
      • 2016-10-21
      • 2013-07-06
      • 2019-08-26
      • 2015-08-21
      • 1970-01-01
      • 2012-03-25
      • 2020-10-07
      • 1970-01-01
      相关资源
      最近更新 更多