使用 jq,将名称/值对数组转换为具有命名键的对象

Jos*_*ved 2 json key object command-line-interface jq

给定格式如下的 json 文件:

[
  {
    "name" : "A",
    "value" : "4"
  },
  {
    "name" : "B",
    "value" : "2"
  },
  {
    "name" : "C",
    "value" : {
      "X": "Something",
      "Y": "Else"
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

我将如何使用 jq 将其转换为这样的内容:

{
  "A": "4",
  "B": "2",
  "C": {
    "X": "Something",
    "Y": "Else"
  }
}
Run Code Online (Sandbox Code Playgroud)

我确实接近使用,jq 'map( { (.name): .value } )但仍然将每个对象留在单独的大括号中,而不是将它们放在一起。

pea*_*eak 5

使用您的方法,只需添加add到您的过滤器:

map( { (.name): .value } ) | add
Run Code Online (Sandbox Code Playgroud)


bow*_*eeb 2

这恰好是确切的用例from_entries

$ echo '[
  {
    "name" : "A",
    "value" : "4"
  },
  {
    "name" : "B",
    "value" : "2"
  },
  {
    "name" : "C",
    "value" : {
      "X": "Something",
      "Y": "Else"
    }
  }
]' | jq 'from_entries'
Run Code Online (Sandbox Code Playgroud)
{
  "A": "4",
  "B": "2",
  "C": {
    "X": "Something",
    "Y": "Else"
  }
}
Run Code Online (Sandbox Code Playgroud)

请参阅: https: //stedolan.github.io/jq/manual/v1.6/#to_entries,from_entries,with_entries(链接到,1.6因为它是撰写本文时最新的,但from_entries至少自 以来就可用1.2。)

如果您from_entries已经注意到但认为它不起作用,因为您的数据不是namekey请注意文档中的这段引用(上面链接):

from_entries接受 key、Key、name、Name、value 和 Value 作为键。

所以name在这里工作得很好。

如果 的使用key是可以接受的,那么(使用to_entries)相反的操作也可以:

echo '{
  "A": "4",
  "B": "2",
  "C": {
    "X": "Something",
    "Y": "Else"
  }
}' | jq 'to_entries'
Run Code Online (Sandbox Code Playgroud)
[
  {
    "key": "A",
    "value": "4"
  },
  {
    "key": "B",
    "value": "2"
  },
  {
    "key": "C",
    "value": {
      "X": "Something",
      "Y": "Else"
    }
  }
]
Run Code Online (Sandbox Code Playgroud)