如何使用jq交换对象的键和值?

时间:2016-11-28 15:29:22

标签: json key jq

使用jq我想反转一个json对象,使属性成为值,值成为键。

来源:

{ 
    "123": "Foobar"
    "567": "Poit"
} 

目标:

{ 
    "Foobar": "123"
    "Poit": "567"
} 

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:8)

在您的特定情况下:

to_entries | map( {(.value) : .key } ) | add

更强大:

to_entries | map( {(.value|tostring) : .key } ) | add

或者如果您愿意:

with_entries( .key as $k | .key = (.value|tostring) | .value = $k )

答案 1 :(得分:1)

如果某些键的值相等,那么您可能希望将键数组作为值:

to_entries
| map( {(.value) : {(.key):null} } )
| reduce .[] as $item ({}; . * $item)
| to_entries
| map({key:.key, value:(.value|keys)})
| from_entries

输入:

{
  "key1": "val0",
  "key2": "val1",
  "key3": "val1"
}

输出:

{
  "val0": ["key1"],
  "val1": ["key2", "key3"]
}

答案 2 :(得分:1)

我将使用类似于@peak答案的方法,但不使用add方法

首先使用to_entries获得如下输出:

-> to_entries
Output:
[
  {
    "key": "123",
    "value": "Foobar"
  },
  {
    "key": "567",
    "value": "Poit"
  }
]

然后使用map交换键和值:

-> to_entries | map({key: .value|tostring, value: .key})  ###**tostring** method converts a number to string since keys can't be numbers
Output:
[
  {
    "key": "Foobar",
    "value": "123"
  },
  {
    "key": "Poit",
    "value": "567"
  }
]

最后使用from_entries删除key/value并返回原始格式:

-> to_entries | map({key: .value|tostring, value: .key}) | from_entries
Output:
{
  "Foobar": "123",
  "Poit": "567"
}