【问题标题】:Parsing of JSON returns error while the JSON seems to be fineJSON 的解析返回错误,而 JSON 似乎没问题
【发布时间】:2016-07-21 10:02:28
【问题描述】:

当我尝试在 ruby​​(或http://json.parser.online.fr/)中解析以下 JSON 时,我收到一个错误,但我不知道为什么。

要解析的JSON:

"{\"RED\"=>{\"t1\"=>0, \"t2\"=>2},
  \"DANGEROUS_SITUATION\"=>{\"t1\"=>28, \"t2\"=>33},
  \"SUB\"=>{\"t1\"=>1, \"t2\"=>0}, \"RED_CARS\"=>{\"t1\"=>0, \"t2\"=>0},
  \"CRASH\"=>{\"t1\"=>10, \"t2\"=>6}, \"TRICKS\"=>{\"t1\"=>2,
  \"t2\"=>3}, \"FREE_TRIES\"=>{\"t1\"=>9, \"t2\"=>5},
  \"OWNERS\"=>{\"t1\"=>48, \"t2\"=>52}, \"ERRORS\"=>{\"t1\"=>5,
  \"t2\"=>9}, \"YELLOW_CARS\"=>{\"t1\"=>0, \"t2\"=>0},
  \"FANS\"=>{\"t1\"=>40, \"t2\"=>41}}"

编辑:如下文所述,这不是 Json,而是字符串化的 Ruby 哈希,有没有办法将其转换为 Ruby 哈希?

【问题讨论】:

  • 这不是 JSON。这是字符串化的红宝石哈希。因此无法解析(使用json解析器)
  • 好的,有没有办法将其转换回 ruby​​ 哈希?
  • 有几种方法,但您最好修复产生此内容的东西,并使其发出正确的 json。 JSON 是一种有效的数据交换格式。字符串化的红宝石哈希不是。
  • 是的,我设法找到了它的来源并进行了更改,这解决了问题,谢谢

标签: ruby json parsing


【解决方案1】:

对你来说最安全的方法是 gsub 火箭的冒号,然后解析字符串,即

stringified_hash = "{\"RED\"=>{\"t1\"=>0, \"t2\"=>2}, \"DANGEROUS_SITUATION\"=>{\"t1\"=>28, \"t2\"=>33}, \"SUB\"=>{\"t1\"=>1, \"t2\"=>0}, \"RED_CARS\"=>{\"t1\"=>0, \"t2\"=>0}, \"CRASH\"=>{\"t1\"=>10, \"t2\"=>6}, \"TRICKS\"=>{\"t1\"=>2, \"t2\"=>3}, \"FREE_TRIES\"=>{\"t1\"=>9, \"t2\"=>5}, \"OWNERS\"=>{\"t1\"=>48, \"t2\"=>52}, \"ERRORS\"=>{\"t1\"=>5, \"t2\"=>9}, \"YELLOW_CARS\"=>{\"t1\"=>0, \"t2\"=>0}, \"FANS\"=>{\"t1\"=>40, \"t2\"=>41}}"
JSON.parse(stringified_hash.gsub('=>', ':')

您也可以 eval 将 stringified_hash 返回到 Hash,然后调用 .to_json 但如果字符串中有任何可评估的代码,这很容易受到攻击

json = eval("{\"RED\"=>{\"t1\"=>0, \"t2\"=>2}, \"DANGEROUS_SITUATION\"=>{\"t1\"=>28, \"t2\"=>33}, \"SUB\"=>{\"t1\"=>1, \"t2\"=>0}, \"RED_CARS\"=>{\"t1\"=>0, \"t2\"=>0}, \"CRASH\"=>{\"t1\"=>10, \"t2\"=>6}, \"TRICKS\"=>{\"t1\"=>2, \"t2\"=>3}, \"FREE_TRIES\"=>{\"t1\"=>9, \"t2\"=>5}, \"OWNERS\"=>{\"t1\"=>48, \"t2\"=>52}, \"ERRORS\"=>{\"t1\"=>5, \"t2\"=>9}, \"YELLOW_CARS\"=>{\"t1\"=>0, \"t2\"=>0}, \"FANS\"=>{\"t1\"=>40, \"t2\"=>41}}").to_json

【讨论】:

    【解决方案2】:

    预期的 Json 格式是这样的:

    {
     "RED":{"t1":0, "t2":2}, 
     "DANGEROUS_SITUATION":{"t1":28, "t2":33}, 
     "SUB":{"t1":1, "t2":0}, 
     "RED_CARS":{"t1":0, "t2":0}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 2021-04-23
      • 2012-05-14
      • 2018-04-21
      • 2023-01-10
      • 2020-12-30
      相关资源
      最近更新 更多