JQ, чтобы изменить значение поля c, выбрав - PullRequest
1 голос
/ 02 мая 2020

У меня есть проект. json файл и его содержимое выглядят так:

{
    "packageDirectories": [
        {
            "path": "sfdx-source/unpackaged"
        },
        {
            "path": "sfdx-source/untracked"
        },
        {
            "path": "sfdx-source/zipsc",
            "package": "ZipSC",
            "versionName": "Version 0.1",
            "versionNumber": "0.1.0.NEXT",
            "ancestorId":"oldValue",
            "default": true
        },
        {
            "path": "sfdx-source/unpackaged/open-cti",
            "package": "OpenCTI",
            "versionName": "Ver 0.3",
            "versionNumber": "0.3.0.NEXT",
            "ancestorId": "04t1P000000cB425QAE",
            "default": false
        }
    ],
    "sfdcLoginUrl": "https://login.salesforce.com",
    "sourceApiVersion": "47.0",
    "namespace": "ZAR",
    "packageAliases": {
        "ZAR": "0Ho1P000000XZA4SAO",
        "OpenCTI": "0Ho1P000000X3AvSAO"
    }
}

Я хочу изменить поле ancestorId для объектов packageDirectory, где значение по умолчанию - true. В этом случае oldValue в примере должно стать newValue. Вывод должен быть следующим. Как мне сделать это с JQ на сценарий оболочки.

{
    "packageDirectories": [
        {
            "path": "sfdx-source/unpackaged"
        },
        {
            "path": "sfdx-source/untracked"
        },
        {
            "path": "sfdx-source/zipsc",
            "package": "ZipariSC",
            "versionName": "Version 0.1",
            "versionNumber": "0.1.0.NEXT",
            "ancestorId":"newValue",
            "default": true
        },
        {
            "path": "sfdx-source/unpackaged/open-cti",
            "package": "OpenCTI",
            "versionName": "Ver 0.3",
            "versionNumber": "0.3.0.NEXT",
            "ancestorId": "04t1P000000cB425QAE",
            "default": false
        }
    ],
    "sfdcLoginUrl": "https://login.salesforce.com",
    "sourceApiVersion": "47.0",
    "namespace": "ZAR",
    "packageAliases": {
        "ZAR": "0Ho1P000000XZA4SAO",
        "OpenCTI": "0Ho1P000000X3AvSAO",
    }
}

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Вы бы использовали для него выражение if-then-else, а не select.

.packageDirectories |= map(
  if .default == true
  then .ancestorId = "newValue"
  else . end
)

демо на jqplay.org

0 голосов
/ 03 мая 2020

FYPI, есть способ достичь цели, используя select:

.packageDirectories[] |=
  ((select(.default == true) | .ancestorId = "newValue") // . )
...