从JSON中解析变量,然后使用curl在带有变量的几个url上循环

时间:2018-06-19 07:25:21

标签: json shell jq

我是jq的新手。我的业务问题如下:我有几个GPS位置地址存储在几个JSON中。 JSON格式如下:

{
    "Data": [{
        "Date": "2018-06-19T06:02:12+02:00",
        "Latitude": 46.54225,
        "Longitude": 17.13874,
        "Type": "GPS",
        "Speed(mph)": 0,
        "Speed(km/h)": 0,
        "Direction": null,
        "Altitude(ft)": 406,
        "Altitude(m)": 124,
        "Accuracy": 50
    },
    {
        "Date": "2018-06-19T06:59:49+02:00",
        "Latitude": 46.53973,
        "Longitude": 17.06964,
        "Type": "GPS",
        "Speed(mph)": 1,
        "Speed(km/h)": 2,
        "Direction": 208,
        "Altitude(ft)": 377,
        "Altitude(m)": 115,
        "Accuracy": 10
    }]
}

我想在纬度和经度值上循环,将它们逐个存储在两个变量中,对于这些变量,我想用shell脚本调用Google的反向地理编码rest API - 对: https://maps.googleapis.com/maps/api/geocode/json?latlng=[VARIABLE1],[VARIABLE2]&key=APIKEYHERE

在另一个Stackoverflow问题中,有一个类似的问题。感谢这个问题,我试过这样的事情,但显然变量不能正常工作:

"error_message" : "Invalid request. Invalid 'latlng' parameter.",
"results" : [],
"status" : "INVALID_REQUEST"

代码:

jq -rc '.Latitude + " " +.Longitude' /usr/location/archive/location_1806181400.json |
while read -r Latitude Longitude; do
    curl https://maps.googleapis.com/maps/api/geocode/json?latlng=$Latitude,$Longitude&key=APIKEYHERE
done

2 个答案:

答案 0 :(得分:0)

你可以尝试:

jq -r '.Data[] | "\(.Latitude) \(.Longitude)"' /usr/location/archive/location_1806181400.json | while read l g; do 
  curl "https://maps.googleapis.com/maps/api/geocode/json?latlng=${l},${g}&key=APIKEYHERE"; 
done

与您的几乎相同,但jq脚本和curl命令的引用除外。

答案 1 :(得分:0)

问题在于您的jq过滤器,您需要执行如下的插值逻辑,以CSV格式输出值,您可以使用shell循环解析它。

jq -r '(.Data[] | "\(.Latitude),\(.Longitude)")'

现在把它放在循环中

jq -r '(.Data[] | "\(.Latitude),\(.Longitude)")' /usr/location/archive/location_1806181400.json |
   while IFS=, read -r lat long; do
       curl "https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${long}&key=APIKEYHERE"
   done