JQ将键/值添加到json对象以枚举对象

kxe2p93d  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(199)

我有一个对象列表(总共20个),我需要插入一个新的键-值对,其中包含每个对象的位置编号(值的范围是1到20)。我已经设法把这段代码放在一起,但是我最终复制了数组中的对象,所以我最终得到了大约100个对象,而不是20个对象。

jq "(.data.items, .data.primaryItemResultList.items)| values | length as $l | values[] += {ranking: range(1, $l)}| .[]"

当我试图将一个静态值添加到“排名”中时,它工作正常,但是如果我使用range函数,它不会产生前面提到的所需输出。
以下是缩短代码的示例:

{
  "data": {
    "items": [
      {
        "id": "items_10244-20964274",
        "size": "80 ct",
        "productId": "20964274",
        "brandName": "peets",
        "brandId": "25555",
        "retailer": {
          "isUltrafast": false,
          "__typename": "RetailersRetailer"
        },
      },
      {
        "id": "items_10244-17284948",
        "size": "75 ct",
        "productId": "17284948",
        "legacyId": "2991007854",
        "brandName": "peet's",
        "brandId": "50954",
        "retailer": {
          "isUltrafast": false,
          "__typename": "RetailersRetailer"
        },
      },
      {
        "id": "items_10244-19232655",
        "size": "3 lb",
        "productId": "19232655",
        "brandName": "kirkland signature",
        "brandId": "7632",
        "retailer": {
          "isUltrafast": false,
          "__typename": "RetailersRetailer"
      }
    ]
  }
}

有人能帮助解决这个问题并找出错误吗?
预期输出为:

{
  "data": {
    "items": [
      {
        "id": "items_10244-20964274",
        "size": "80 ct",
        "productId": "20964274",
        "brandName": "peets",
        "brandId": "25555",
        "ranking": 1,
        "retailer": {
          "isUltrafast": false,
          "__typename": "RetailersRetailer"
        },
      },
      {
        "id": "items_10244-17284948",
        "size": "75 ct",
        "productId": "17284948",
        "legacyId": "2991007854",
        "brandName": "peet's",
        "brandId": "50954",
        "ranking": 2,
        "retailer": {
          "isUltrafast": false,
          "__typename": "RetailersRetailer"
        },
      },
      {
        "id": "items_10244-19232655",
        "size": "3 lb",
        "productId": "19232655",
        "brandName": "kirkland signature",
        "brandId": "7632",
        "ranking": 3,
        "retailer": {
          "isUltrafast": false,
          "__typename": "RetailersRetailer"
      }
    ]
  }
njthzxwz

njthzxwz1#

您可以利用to_entries在应用于数组时将使用(从0开始的)项索引作为.key的情况。添加+1使其从1开始。

.data.items |= [to_entries[] | .value + {ranking: (.key+1)}]

Demo
对于基于range(length)的方法,我将使用transpose压缩items数组和indices数组:

.data.items |= ([., [range(length)+1]] | transpose | map(.[0] + {ranking: .[1]}))

Demo
输出量:

{
  "data": {
    "items": [
      {
        "id": "items_10244-20964274",
        "size": "80 ct",
        "productId": "20964274",
        "brandName": "peets",
        "brandId": "25555",
        "retailer": {
          "isUltrafast": false,
          "__typename": "RetailersRetailer"
        },
        "ranking": 1
      },
      {
        "id": "items_10244-17284948",
        "size": "75 ct",
        "productId": "17284948",
        "legacyId": "2991007854",
        "brandName": "peet's",
        "brandId": "50954",
        "retailer": {
          "isUltrafast": false,
          "__typename": "RetailersRetailer"
        },
        "ranking": 2
      },
      {
        "id": "items_10244-19232655",
        "size": "3 lb",
        "productId": "19232655",
        "brandName": "kirkland signature",
        "brandId": "7632",
        "retailer": {
          "isUltrafast": false,
          "__typename": "RetailersRetailer"
        },
        "ranking": 3
      }
    ]
  }
}

注意事项:JSON不支持也不识别对象字段的顺序。因此,新的ranking字段的实际位置在结构上没有区别。但是,您可以调整jq以改变它为输出生成的文本表示。例如,要将retailer字段移动到最后一个位置,删除它并使用del(.retailer) + {retailer}再次添加它(请参见to_entriesrange/transpose方法的演示)。但请记住,这种修改只是为了美观。任何JSON后处理程序都可能再次忽略这种顺序。

相关问题