【问题标题】:How to swap key and value of an object using jq?如何使用 jq 交换对象的键和值?
【发布时间】:2017-04-12 09:21:21
【问题描述】:

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

来源:

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

目标:

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

我怎样才能做到这一点?

【问题讨论】:

    标签: json key jq


    【解决方案1】:

    在您的特定情况下:

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

    更稳健:

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

    或者,如果您愿意:

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

    警告:所有这些都可能有损失。

    【讨论】:

      【解决方案2】:

      我会使用类似于@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_entrieskey/value去掉,回到原来的格式:

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

      【讨论】:

        【解决方案3】:

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

        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"]
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多