Добавьте пару ключ-значение в json файл с powershell - PullRequest
0 голосов
/ 09 января 2020

У меня есть json, как это, я хочу добавить ключ строки: значение для каждой строки в моем файле.

Например, добавить запятую и значение K C -NA- asplan-PROJECTS-DEV-01 перед фигурной скобкой.

 [
     {
       "name": "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-01"
     },
     {
       "name": "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-02"
     }
    ]

$file="pathtojson"

$jsonContent = Get-Content $file | ConvertFrom-Json;


$appserviceplan= $jsonContent.name;

foreach ($app in $appserviceplan) {
$app.Split('/')[8]
}

Я бы хотел добавить соответствующий $ app.Split ('/') [8] в каждую строку, чтобы иметь

     "name": "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-01", "value": "KC-NA-asplan-PROJECTS-DEV-01"
 },

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Поскольку ваш Json является массивом объектов, я думаю, что очевидный способ состоит в том, чтобы перебрать этот список объектов и для каждого из них вывести новый объект, включающий свойство value. Самый простой способ - использовать Select-Object.

Примерно так:

$file = "D:\blah.json"
$json = Get-Content $file -Raw | ConvertFrom-Json | ForEach-Object {
    $_ | Select-Object name, @{Name = 'value'; Expression = {($_.name -split '/')[8]}}
} | ConvertTo-Json

$json

Результат:

[
    {
        "name":  "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-01",
        "value":  "KC-NA-asplan-PROJECTS-DEV-01"
    },
    {
        "name":  "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-02",
        "value":  "KC-NA-asplan-PROJECTS-DEV-02"
    }
]
0 голосов
/ 09 января 2020

Использование ConvertTo-Json должно работать для вас:

(Get-Content $file | ConvertFrom-Json) | 
    Select-Object -Property *, @{name ="value"; expression={($_.name -split '/')[8]}} | 
    ConvertTo-Json |
    Out-File -FilePath .\newdata.json

Это берет все существующие свойства от каждого объекта (первоначально просто name) и добавляет новое свойство с именем value со значением из ($_.name -split '/')[8].

Затем он преобразует результирующие объекты обратно в JSON, используя ConvertTo-Json, который, для ваших образцов данных, заканчивается как:

[
    {
        "name":  "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-01",
        "value":  "KC-NA-asplan-PROJECTS-DEV-01"
    },
    {
        "name":  "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-02",
        "value":  "KC-NA-asplan-PROJECTS-DEV-02"
    }
]

Также обратите внимание, что может потребоваться перенос (Get-Content $file | ConvertFrom-Json) в скобках, как описано в этом отличном ответе SO .

...