在不使用 eval 的情况下动态检查 JSON 中的字段是否为 nil
Dynamically check if a field in JSON is nil without using eval
这是我正在使用的代码的摘录:
def retrieve(user_token, quote_id, check="quotes")
end_time = Time.now + 15
match = false
until Time.now > end_time || match
@response = http_request.get(quote_get_url(quote_id, user_token))
eval("match = !JSON.parse(@response.body)#{field(check)}.nil?")
end
match.eql?(false) ? nil : @response
end
private
def field (check)
hash = {"quotes" => '["quotes"][0]',
"transaction-items" => '["quotes"][0]["links"]["transactionItems"]'
}
hash[check]
end
我被告知以这种方式使用 eval
不是好的做法。谁能建议一种更好的方法来动态检查 JSON 节点(字段?)是否存在。我想要这样做:
psudo: match = !JSON.parse(@response.body) + dynamic-path + .nil?
将路径存储为路径元素数组 (['quotes', 0]
)。使用一些辅助函数,您将能够避免 eval。确实,这里完全不合适。
大致如下:
class Hash
def deep_get(path)
path.reduce(self) do |memo, path_element|
return unless memo
memo[path_element]
end
end
end
path = ['quotes', 0]
hash = JSON.parse(response.body)
match = !hash.deep_get(path).nil?
这是我正在使用的代码的摘录:
def retrieve(user_token, quote_id, check="quotes")
end_time = Time.now + 15
match = false
until Time.now > end_time || match
@response = http_request.get(quote_get_url(quote_id, user_token))
eval("match = !JSON.parse(@response.body)#{field(check)}.nil?")
end
match.eql?(false) ? nil : @response
end
private
def field (check)
hash = {"quotes" => '["quotes"][0]',
"transaction-items" => '["quotes"][0]["links"]["transactionItems"]'
}
hash[check]
end
我被告知以这种方式使用 eval
不是好的做法。谁能建议一种更好的方法来动态检查 JSON 节点(字段?)是否存在。我想要这样做:
psudo: match = !JSON.parse(@response.body) + dynamic-path + .nil?
将路径存储为路径元素数组 (['quotes', 0]
)。使用一些辅助函数,您将能够避免 eval。确实,这里完全不合适。
大致如下:
class Hash
def deep_get(path)
path.reduce(self) do |memo, path_element|
return unless memo
memo[path_element]
end
end
end
path = ['quotes', 0]
hash = JSON.parse(response.body)
match = !hash.deep_get(path).nil?