#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