【问题标题】:Reshape JSON with JQ用 JQ 重塑 JSON
【发布时间】:2021-02-16 03:34:08
【问题描述】:

我正在尝试使用 JQ 重塑 JSON 文件,但似乎找不到正确的方法。

基本上我正在尝试将一些键转换为值,并重新组织 JSON 的某些部分。

源 JSON 如下:

{
  "ABCC": {
    "pairs": {
      "CND": {
        "tsyms": {
          "BTC": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          },
          "ETH": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          }
        }
      },
      "ELF": {
        "tsyms": {
          "ETH": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          },
          "BTC": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          }
        }
      }
    }
  },
  "ACX": {
    "pairs": {
      "PLA": {
        "tsyms": {
          "AUD": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          },
          "USDT": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          }
        }
      },
      "BTC": {
        "tsyms": {
          "USDT": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          },
          "AUD": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          }
        }
      }
    }
  }
}

预期的 JSON 输出会是这样的:

{
  "ABCC": {
    "pairs": [
      "CND/BTC",
      "CND/ETH",
      "ELF/ETH",
      "ELF/BTC"
    ]
  },
  "ACX": {
    "pairs": [
      "PLA/AUD",
      "PLA/USDT",
      "BTC/USDT",
      "BTC/AUD"
    ]
  }
}

知道我是如何达到这个结果的吗?

谢谢!

【问题讨论】:

    标签: json nested key jq


    【解决方案1】:

    一个简单的解决方案的关键是编写一个辅助函数来提取键/键字符串:

    # emit a stream of key1/key3 strings
    def pairs:
      keys_unsorted[] as $k1
      | .[$k1][]
      | keys_unsorted[] as $k3
      | "\($k1)/\($k3)";
    

    现在,感谢 jq 的 |= 运算符,解决方案可以简单地写成:

    map_values(.pairs |= [pairs])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多