Есть ли способ разделить данные json из файла в powershell?

#json #powershell #replace #split

#json #powershell #заменить #разделить

Вопрос:

Я считываю данные из файла 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», поскольку это также фактор в моем уравнении.

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

Спасибо.

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

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

Комментарии:

1. Вы могли бы поиграть с -split регулярными выражениями, но на самом деле единственный надежный способ IMO — преобразовать в object. В конце концов… JSON — это объектная нотация JavaScript.

Ответ №1:

Что вам следует сделать, так это прочитать файл 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. Вы правы, мой json был плохим. Я обязательно исправлю это сразу, спасибо. Редактировать: кто-то уже сделал; P

2. @Graesholt. Молодец. Я удалил это замечание из ответа

Ответ №2:

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

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

Ответ №3:

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

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