使用Ruby搜索JSON响应

Kri*_*her 20 ruby json ruby-on-rails

我使用Ruby脚本与应用程序API进行交互,返回的结果是JSON格式.例如:

{
  "incidents": [
    {
      "number": 1,
      "status": "open",
      "key": "abc123"
    }
    {
      "number": 2,
      "status": "open",
      "key": "xyz098"
    }
    {
      "number": 3,
      "status": "closed",
      "key": "lmn456"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我希望在每个块中搜索特定的"键"值(在此示例中为yzx098)并返回关联的"数字"值.

现在,我对Ruby很新,我不确定是否已经有一个功能来帮助实现这个目标.然而,几天搜索谷歌和Ruby资源书并没有产生任何有用的东西.

有什么建议?

Kir*_*rat 39

首先,JSON应如下所示:(注意逗号)

 {
  "incidents": [
    {
      "number": 1,
      "status": "open",
      "key": "abc123"
    },
    {
      "number": 2,
      "status": "open",
      "key": "xyz098"
    },
    {
      "number": 3,
      "status": "closed",
      "key": "lmn456"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

在变量中使用上面的json

s =  '{"incidents": [{"number": 1,"status": "open","key": "abc123"},{"number": 2,"status": "open","key": "xyz098"},{"number": 3,"status": "closed","key": "lmn456"}]}'
Run Code Online (Sandbox Code Playgroud)

解析JSON

h = JSON.parse(s)
Run Code Online (Sandbox Code Playgroud)

找到所需的number使用map

h["incidents"].map {|h1| h1['number'] if h1['key']=='xyz098'}.compact.first
Run Code Online (Sandbox Code Playgroud)

或者你也可以使用find如下

 h["incidents"].find {|h1| h1['key']=='xyz098'}['number']
Run Code Online (Sandbox Code Playgroud)

或者你也可以使用select如下

h["incidents"].select {|h1| h1['key']=='xyz098'}.first['number']
Run Code Online (Sandbox Code Playgroud)