如何在jq中按键和这些键的值对json文件进行排序

m3eecexj  于 2023-02-14  发布在  其他
关注(0)|答案(3)|浏览(154)

我们正在使用PentahoCTools库构建一个网站,该库有一个图形化 Jmeter 板编辑器,它可以为 Jmeter 板的一部分写出JSON格式的文件。
我想在签入git之前对这些文件进行一个转换,以便先按键排序,然后再按键的值排序,这样做的目的是让diffs更容易,因为编辑器有重新排列所有json字段的习惯。
例如,我们可能会有这样的东西:

{
  "components": {
    "rows": [
      {
        "id": "CHARTS",
        "name": "Charts",
        "parent": "UnIqEiD",
        "properties": [
          {
            "name": "Group",
            "type": "Label",
            "value": "Charts"
          }
        ],
        "type": "Label",
        "typeDesc": "<i>Group</i>"
      },
      {
        "id": "kjalajsdjf",
        "meta_cdwSupport": "true",
        "parent": "CHARTS",
        "properties": [
          {
            "name": "name",
            "type": "Id",
            "value": "Value1"
          },
          {
            "name": "title",
            "type": "String",
            "value": "Value2"
          },
          {
            "name": "listeners",
            "type": "Listeners",
            "value": "[]"
          },
...

我们可以使用jq --sort-keyshttp://stedolan.github.io/jq/)对所有键进行排序,但是我很难找到如何使用sort_by函数,然后根据某些键的值对某些特定的元素进行排序(因此,在上面的示例中,例如按properties.name排序。

qij5mzcb

qij5mzcb1#

好吧,在IRC频道的帮助下,我找到了答案。
基本上,它看起来是这样的:

jq \
  '.components.rows|=sort_by(.id)|.components.rows[].properties|=sort_by(.name)' \
  file.json > out.json

选择正确的对象,
如果需要,进入数组,
sort_by为单个值。
我正在尝试sort_by(.components.rows.id),但失败了。
|=而不是|传递值沿着而不是剥离它们。

ifmq2ha2

ifmq2ha22#

这并没有回答这个问题,但这里有另一种按属性/键排序的方法:

jq --sort-keys . my_file > sorted_file
  • 或-
jq -S . my_file > sorted_file
5tmbdcev

5tmbdcev3#

如果您需要在JQ查询中使用它,请访问:

def sort_keys:
    (if (.|type!="object") then error("sort_keys: object expected") else . end)
    |(.|keys) as $keys
    |. as $o
    |reduce $keys[] as $i ({};.[$i]=$o[$i]);

相关问题