如何消除或防止 Crystal 中的“缺少哈希密钥”错误?

问题描述 投票:0回答:1

我从 API 获取 JSON 响应,并使用

JSON.parse()
进行解析。我的代码中有一个循环,每次迭代时都会检查 JSON 响应中的某个参数是否等于定义的字符串。这是我收到的 JSON 响应的简单版本:

{
  "response": [
    {
      "data": {
        "parameter": "value"
      }
    },
    {
      "data": {
        "parameter": "value2"
      }
    },
    {
      "data": {
        "parameter2": "value"
      }
    }
  ]
}

如您所见,只有

response[0]
response[1]
包含
parameter
response[2]
parameter2
。 所以如果我循环遍历它:

while i < responses.size
  response = responses[i]
  if(response.data.parameter == "value")
    *do something*
  end
end

当我进行第三次迭代时,我会得到

Unhandled exception: Missing hash key: "parameter"
。我可以忽略或者更好地防止错误发生吗?

提前谢谢您!

crystal-lang
1个回答
0
投票

如果您正确地将数据读取为哈希值的哈希值,则可以使用

has_key?
过滤掉无效响应。以下示例代码对我有用:

responses = {
  "response" => [
    {
      "data" => {
        "parameter" => "value",
      },
    },
    {
      "data" => {
        "parameter" => "value2",
      },
    },
    {
      "data" => {
        "parameter2" => "value",
      },
    },
  ],
}

pp responses

responses["response"].each do |response|
  if response["data"].has_key?("parameter")
    pp response
    valid_response = response["data"]
    if valid_response["parameter"] == "value"
      puts "Doing something..."
    end
  end
end

并产生以下输出:

{"response" =>
  [{"data" => {"parameter" => "value"}},
   {"data" => {"parameter" => "value2"}},
   {"data" => {"parameter2" => "value"}}]}
{"data" => {"parameter" => "value"}}
Doing something...
{"data" => {"parameter" => "value2"}}
© www.soinside.com 2019 - 2024. All rights reserved.