ruby:从嵌套的 json 中提取字段
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21737040/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
ruby: Extracting fields from nested json
提问by achan
I am trying to teach myself ruby and solve a problem at work. My ultimate goal is to extract out three of the many fields in JSON response from an API, manipulate and dump to CSV for executive reporting.
我正在尝试自学 ruby 并解决工作中的问题。我的最终目标是从 API 中提取 JSON 响应中众多字段中的三个,操作并转储到 CSV 以进行执行报告。
The structure of the JSON is:
JSON 的结构是:
{
"status": 200,
"data": {
"total": 251,
"alerts": [
{
"dataPoint": "x",
"ackedBy": "x",
"dataSourceInstance": "x",
"dataSource": "x",
"host": "x",
"endOn": 0,
"ackedOn": 1385085190,
"dataSourceInstanceId": 588384,
"hostId": 935,
"type": "alert",
"dataSourceId": 694,
"ackedOnLocal": "2013-11-21 17:53:10 PST",
"id": 6170384,
"startOn": 1385084917,
"thresholds": "!= 1 1 1",
"endOnLocal": "",
"level": "error",
"ackComment": "x",
"value": "No Data",
"hostDataSourceId": 211986,
"acked": true,
"hostGroups": [{
"alertEnable": true,
"createdOn": 1362084592,
"id": 21,
"parentId": 78,
"description": "",
"appliesTo": "",
"name": "2600hz",
"fullPath": "x"
}],
"startOnLocal": "2013-11-21 17:48:37 PST"
},
To be specific I want to extract out dataPoint,startOn,ackedOn.
具体来说,我想提取dataPoint, startOn, ackedOn.
I am thinking I need to extract the total value first, so I know how many alerts I have. That will help me loop through the alert instances.
我想我需要先提取总价值,所以我知道我有多少警报。这将帮助我遍历警报实例。
*url = "https://xyz"
uri = URI(url)
http = Net::HTTP.new(uri.host, 443)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
req = Net::HTTP::Get.new(uri.request_uri)
response = http.request(req)
# Make sure we had a proper web response
if response.code == '200' then
# Set up that the total is two levels deep in the json
path = JsonPath.new('$.total')
# Extract out total field into variable
totalAlerts = path.on(response)
# Print hash to confirm value
pp totalAlerts
end*
I am stuck trying to just extract out the total. Output shows nothing:
我被困在试图提取总数。输出什么也没显示:
sudo ruby alerts.rb
[]
Is there a better way to do this?
有一个更好的方法吗?
回答by DiegoSalazar
Try this:
尝试这个:
# just for demonstration, you would probably do json = JSON.parse(response)
json = {
"status": 200,
"data": {
"total": 251,
"alerts": [
{
"dataPoint": "x",
"ackedBy": "x",
...
For just the total:
仅为总数:
total = json['data']['total']
For the other values you asked about:
对于您询问的其他值:
json['data']['alerts'].each do |alerts|
# do whatever you want with these...
alerts['dataPoint']
alerts['startOn']
alerts['ackedOn']
Now the question is, what do you want to do with the results? Do you want to collect them into a new hash? The json['data']['alerts']is an array so you have to decide how you want to collect them. You could do:
现在的问题是,你想对结果做什么?你想把它们收集到一个新的哈希中吗?这json['data']['alerts']是一个数组,因此您必须决定如何收集它们。你可以这样做:
collected_alerts = { 'dataPoints' => [], 'startOns' => [], 'ackedOns' => [] }
json['data']['alerts'].each do |alerts|
collected_alerts['dataPoints'] << alerts['dataPoint']
collected_alerts['startOns'] << alerts['startOn']
collected_alerts['ackedOns'] << alerts['ackedOn']
end
Now you can get all those values in collected_alerts
现在你可以得到所有这些值 collected_alerts

