Есть ли способ разделить данные JSON из файла в PowerShell? - PullRequest
0 голосов
/ 04 апреля 2019

Я читаю данные из файла json через powershell с конечной целью обновления указанного файла. Мне нужно разделить данные на порцию, которую я хочу сохранить, и порцию, которую я хочу обновить, и, чтобы еще больше усложнить ситуацию, место, где мне нужно разбить текст, меняется в цикле foreach, поэтому мне нужна эта часть для приходят из переменной.

Я пробовал .split/-split и .replace/-replace во многих конфигурациях, но кажется, что это сложнее, чем можно было бы предположить в powershell .

Все перечисленные ниже файлы в одной папке.

Json (json.json):

{
  "Section1": {
    "Heading1": [
      "Thing1",
      "Thing2"
    ]
  },
  "Section2": [
    "Thing1",
    "Thing2"
  ]
}

Powershell (powershell.ps1):

$originalJsonString = Get-Content -Path ".\json.json"
$SplitTarget = "Section2"

$JsonString = {This is the part that I am iffy about}

Write-Output $JsonString

Вывод, который я хочу получить из приведенного выше, будет

{
"Section1": {
    "Heading1": [
        "Thing1",
        "Thing2"
    ]
},

Я перепробовал практически все, что я могу придумать в отношении разделения и замены, но все же решение намекает на меня. Обратите внимание на решение выше, что важным фактором является то, что $originalJsonString делится (или что-то еще) на $ SplitTarget, а не "Section2", поскольку это также является фактором в моем уравнении.

Я спрашиваю впервые, поэтому, если я что-то делаю не так, прошу прощения.

Спасибо.

Edit: Справедливо, если я добавлю причину, по которой я не преобразую объект. Синтаксис, который экспортирует powershell при преобразовании json в объект и обратно, нежелателен для моего использования. Однако, если использование объекта является ЕДИНСТВЕННЫМ способом, а разрезание исключено, то необходимо найти другое решение. Спасибо.

Edit: Если объекты были подходящим способом, в итоге я нашел более сложный способ форматирования .json так, как я этого хотел. Спасибо всем.

Ответы [ 3 ]

2 голосов
/ 04 апреля 2019

Что вы должны сделать, это прочитать файл json, используя:

$json = Get-Content .\json.json -raw | ConvertFrom-Json

Я подделал это здесь, используя 'here-string':

$json = @"
{
    "Section1": {
        "Heading1": [
            "Thing1",
            "Thing2"
        ]
    },
    "Section2": [
        "Thing1",
        "Thing2"
    ]
}
"@ | ConvertFrom-Json

Далее, определите, что выхотите сохранить или обновить:

$sectionToKeep   = "Section1"
$sectionToUpdate = "Section2"

Чтобы увидеть, что там, используйте $json.$sectionToKeep | ConvertTo-Json

{
    "Heading1":  [
                     "Thing1",
                     "Thing2"
                 ]
}

Далее, обновите $ section2, оставив все остальное нетронутым.Я пишу объект, который хранит массив, как в $sectionToKeep:

$json.$sectionToUpdate = @{'Heading2' = 'Thing3', 'Thing4'}

и, наконец, выводит (или записывает обратно в файл) новый полный json:

$json | ConvertTo-Json

Использование вашего примера дает вам следующее:

{
    "Section1":  {
                     "Heading1":  [
                                      "Thing1",
                                      "Thing2"
                                  ]
                 },
    "Section2":  {
                     "Heading2":  [
                                      "Thing3",
                                      "Thing4"
                                  ]
                 }
}

Надеюсь, что поможет

1 голос
/ 04 апреля 2019

Не уверен, что правильно понял ваш вопрос, но я бы преобразовал Json в объект, а затем отфильтровал субданные и снова создал файл

$obj = Get-Content json.json -raw | ConvertFrom-Json
0 голосов
/ 04 апреля 2019

Если вы хотите просто изолировать раздел и создать новый файл json, вы можете использовать следующее:

$file = Get-Content .\json.json | ConvertFrom-Json
$file | Select-Object Section1 | ConvertTo-Json | Set-Content New.json
...