【发布时间】:2017-04-12 09:21:21
【问题描述】:
使用jq我想反转一个json对象,让属性变成值,值变成键。
来源:
{
"123": "Foobar"
"567": "Poit"
}
目标:
{
"Foobar": "123"
"Poit": "567"
}
我怎样才能做到这一点?
【问题讨论】:
使用jq我想反转一个json对象,让属性变成值,值变成键。
来源:
{
"123": "Foobar"
"567": "Poit"
}
目标:
{
"Foobar": "123"
"Poit": "567"
}
我怎样才能做到这一点?
【问题讨论】:
在您的特定情况下:
to_entries | map( {(.value) : .key } ) | add
更稳健:
to_entries | map( {(.value|tostring) : .key } ) | add
或者,如果您愿意:
with_entries( .key as $k | .key = (.value|tostring) | .value = $k )
警告:所有这些都可能有损失。
【讨论】:
我会使用类似于@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"
}
【讨论】:
如果某些键的值相等,那么您可能希望获得一个键数组作为值:
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"]
}
【讨论】: