使用jq将两个数组合并为一个对象

Sco*_*ott 2 merge json key jq

我正在尝试使用jq将NOAA数据源解析为我需要的值:

http://forecast.weather.gov/MapClick.php?FcstType=json&lat=39.56&lon=-104.85

我能够(单独)提取我想要组合的两个数组:

$ cat noaa.json | jq .time.startPeriodName
[
  "Today",
  "Tonight",
  "Friday",
  "Friday Night",
  "Saturday",
  "Saturday Night",
  "Sunday",
  "Sunday Night",
  "Monday",
  "Monday Night",
  "Tuesday",
  "Tuesday Night",
  "Wednesday"
]

$ cat noaa.json | jq .data.weather
[
  "Mostly Sunny",
  "Mostly Cloudy",
  "Mostly Sunny",
  "Partly Cloudy",
  "Slight Chance Showers",
  "Slight Chance Snow Showers",
  "Slight Chance Snow Showers then Mostly Sunny",
  "Mostly Clear",
  "Mostly Sunny",
  "Partly Cloudy",
  "Mostly Sunny",
  "Partly Cloudy",
  "Mostly Sunny"
]
Run Code Online (Sandbox Code Playgroud)

我想将两个数组组合成一个像这样的对象:

{ 
   "Today": "Mostly Sunny",
   "Tonight": "Mostly Cloudy",
   ...
   "Wednesday": "Mostly Sunny"
}
Run Code Online (Sandbox Code Playgroud)

如果有人能指出我正确的方向,我将不胜感激.我觉得答案可能在map操作员身上,但我无法弄明白.

pea*_*eak 6

是的,这map是一个很好的方式.这里的关键是使用它transpose/0,可以像使用"zip"函数一样使用它:

 [.time.startPeriodName, .data.weather]
 | transpose
 | map( {(.[0]): .[1]})
Run Code Online (Sandbox Code Playgroud)

输出开始如下:

[
  {
    "Today": "Mostly Sunny"
  },
  {
    "Tonight": "Mostly Cloudy"
  },
  ...
Run Code Online (Sandbox Code Playgroud)

因此,要生成单个JSON对象,只需将add过滤器添加到管道即可.

  • 啊,我加了`| add` 到最后,得到了我想要的。 (2认同)