首页 > 解决方案 > 在 Ruby 中解析有效负载的正确方法

问题描述

我有以下有效载荷:

[{:payload=>
   "{\"user\":\"test\",\"job\":\"Test\",\"username\":\"Bob\",\"blocks\":[{\"type\":\"section\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"this is the title\"}},{\"type\":\"context\",\"elements\":[{\"type\":\"mrkdwn\",\"text\":\"Test\"}]},{\"type\":\"divider\"}]}"}]

我试图弄清楚如何提取它。我试过了

JSON.parse(response) 

但我收到以下错误

TypeError: no implicit conversion of Hash into String

如何将此值提取到可以执行以下操作的位置:

response.job == "test" ?

标签: rubyhash

解决方案


假设您的意思是:

response = [{:payload => "{\"user\":\"test\",\"job\":\"Test\",\"username\":\"Bob\",\"blocks\":[{\"type\":\"section\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"this is the title\"}},{\"type\":\"context\",\"elements\":[{\"type\":\"mrkdwn\",\"text\":\"Test\"}]},{\"type\":\"divider\"}]}"}]

然后response是一个包含一个元素的数组。那一个元素是hash。因此,您将使用以下方式访问payload

payload = JSON.parse(response.first[:payload])
=> {
        "user" => "test",
         "job" => "Test",
    "username" => "Bob",
      "blocks" => [
        [0] {
            "type" => "section",
            "text" => {
                "type" => "mrkdwn",
                "text" => "this is the title"
            }
        },
        [1] {
                "type" => "context",
            "elements" => [
                [0] {
                    "type" => "mrkdwn",
                    "text" => "Test"
                }
            ]
        },
        [2] {
            "type" => "divider"
        }
    ]
}

然后该payload对象是一个哈希,并且可以使用标准[]调用访问其子元素:

job = payload['job']
=> "Test"

推荐阅读