【问题标题】:Convert JSON into a Hash将 JSON 转换为哈希
【发布时间】:2015-01-29 16:02:04
【问题描述】:

我有这个 JSON,我正在尝试将它从 Postman 发送到 Rails API:

{"object": 
 { 
    "type": "out", 
    "vars": 
    {
      "x": "x", 
      "y": "y"
    }, 
    "values": 
    {
      "ts": "timestamp", 
      "ok": 
      {
        "total": 2, 
        "min": "x", 
        "max": "y"
      }, 
      "error": 
      {
         "total": 2, 
         "error1": "first", 
         "error2": "second"
      }
    }
  }
 }

我需要在我的模型中将其转换为Hash,以便我可以使用before_create 对其进行操作。这是我带来的:

object = self.to_json # => converts object to json
object = JSON.parse(object) # => converts json to hash

第一个问题:我明白了(id=>nil 不相关,因为它会自动插入到数据库中):

 {"id"=>nil, "type"=>"out", "vars"=>{"x"=>"x", "y"=>"y"}, "values"=>{"ts"=>"timestamp", "ok"=>"{\"total\"=>2, \"min\"=>\"x\", \"max\"=>\"y\"}", "error"=>"{\"total\"=>2, \"error1\"=>\"first\", \"error2\"=>\"second\"}"}, "created_at"=>"2015-01-29T15:45:01.329Z", "updated_at"=>"2015-01-29T15:45:01.329Z"}

当我尝试操纵 object["values"]["ok"] 时,Rails 发送错误:

unexpected token at '"{\"total\"=\u003e2, \"min\"=\u003e\"x\", \"max\"=\u003e\"y\"}"'

第二个问题:我只能调用object["values"],我想用符号调用它,而不是字符串object[:values]

【问题讨论】:

  • 第二个问题 => JSON.parse(object).with_indifferent_access
  • 感谢@apneadiving 解决了它。希望也能解决我的第一个问题:)
  • 为什么要转换成 JSON 再转换回来?
  • 为什么不直接调用as_json,它会在编码之前为您提供哈希值?
  • 这一直有效。我用object = self.as_json.with_indifferent_access。问题是当我到达object[:values][:ok].is_a? Hash 时这是错误的,尽管它的打印方式类似于{"total"=>2, "min"=>"x", "max"=>"y"}

标签: ruby-on-rails ruby json hash


【解决方案1】:

使用以下方法解决了我的问题:

object = self.as_json.with_indifferent_access
# => allowing me to use a symbol key instead of a string

ok_vals = object[:values][:ok].as_json.gsub(/\=\>/, ':')
# => allowing to change json string '{"val1"=>"val1", "val2"=>"val2"}' to '{"val1":"val1", "val2":"val2"}'
ok_vals = JSON.parse(ok_vals)
# => which transform json string to hash {val1: "val1", val2: "val2"}

请随时对此代码提出任何建议。感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2019-05-23
    • 2013-11-13
    相关资源
    最近更新 更多