Конвертировать JSON в YAML с помощью PowerShell

1720
Ishan

У меня есть данные JSON, как это.

sample.json

[ { "id": 0, "name": "Cofine", "title": "laboris minim qui nisi esse amet non", "description": "Consequat laborum quis exercitation culpa. Culpa esse sint consectetur deserunt non.", "website": "cofine.com", "image": "http://placehold.it/32x32", "labels": ["blue", "red"], "labels_link": ["http://cofine.com/labels/blue","http://cofine.com/labels/red"], }, { "id": 1, "name": "Zomboid", "title": "adipisicing mollit esse aliquip ullamco nisi laboris", "description": "Enim consectetur eu commodo officia. Id pariatur proident nostrud occaecat adipisicing voluptate do nisi incididunt id ex commodo.", "website": "zomboid.com", "image": "http://placehold.it/32x32", "labels": ["red"], "labels_link": ["http://zomboid.com/labels/red"], }, { "id": 2, "name": "Sulfax", "title": "non minim anim irure nulla ad elit", "description": "Pariatur anim officia adipisicing Lorem dolor cillum eu ex veniam sint consequat incididunt. Minim mollit reprehenderit mollit sint laboris consequat.", "website": "sulfax.com", "image": "http://placehold.it/32x32", "labels": ["green", "yellow", "blue"], "labels_link": ["http://sulfax.com/labels/green","http://sulfax.com/labels/yellow","http://sulfax.com/labels/blue"], } ] 

Как преобразовать эти данные json в yaml с помощью PowerShell, где каждый объект json будет преобразован в yaml и сохранен как yaml в своем собственном файле, имя файла которого равно значению свойств ключей заголовка ?

Когда я запускаю следующую команду ($json | ConvertFrom-Json) | ConvertTo-YAML(где ConvertTo-YAMLфункция взята с веб-сайта simpletalk ), это вывод, который я получаю.

Выход

---  id: 0  name: 'Cofine'  title: 'laboris minim qui nisi esse amet non'  description: Consequat laborum quis exercitation culpa. Culpa esse sint consectetur deserunt non.  website: 'cofine.com'  image: 'http://placehold.it/32x32'  labels:  - 'blue'  - 'red'  labels_link:  - 'http://cofine.com/labels/blue'  - 'http://cofine.com/labels/red' ---  id: 1  name: 'Zomboid'  title: 'adipisicing mollit esse aliquip ullamco nisi laboris'  description: Enim consectetur eu commodo officia. Id pariatur proident nostrud occaecat adipisicing voluptate do nisi incididunt id ex commodo.  website: 'zomboid.com'  image: 'http://placehold.it/32x32'  labels:  - 'red'  labels_link:  - 'http://zomboid.com/labels/red' ---  id: 2  name: 'Sulfax'  title: 'non minim anim irure nulla ad elit'  description: Pariatur anim officia adipisicing Lorem dolor cillum eu ex veniam sint consequat incididunt. Minim mollit reprehenderit mollit sint laboris consequat.  website: 'sulfax.com'  image: 'http://placehold.it/32x32'  labels:  - 'green'  - 'yellow'  - 'blue'  labels_link:  - 'http://sulfax.com/labels/green'  - 'http://sulfax.com/labels/yellow'  - 'http://sulfax.com/labels/blue' 

Однако вывод, который я ищу, будет выглядеть следующим образом - где имя файла является значением свойств ключей заголовка, а содержимое файла будет соответствующим объектом json, преобразованным в yaml.

labouris minim qui nisi esse non.yaml

--- id: 0  name: 'Cofine'  title: 'laboris minim qui nisi esse amet non'  description: Consequat laborum quis exercitation culpa. Culpa esse sint consectetur deserunt non. website: 'cofine.com'  image: 'http://placehold.it/32x32'  labels:  - 'blue'  - 'red'  labels_link:  - 'http://cofine.com/labels/blue'  - 'http://cofine.com/labels/red' --- 

адиписис молли эссе аликип ульламко ниси лейборис.ямл

--- id: 1  name: 'Zomboid'  title: 'adipisicing mollit esse aliquip ullamco nisi laboris'  description: Enim consectetur eu commodo officia. Id pariatur proident nostrud occaecat adipisicing voluptate do nisi incididunt id ex commodo. website: 'zomboid.com'  image: 'http://placehold.it/32x32'  labels:  - 'red'  labels_link:  - 'http://zomboid.com/labels/red' --- 

non minim anim irure nulla ad elit.yaml

--- id: 2  name: 'Sulfax'  title: 'non minim anim irure nulla ad elit'  description: Pariatur anim officia adipisicing Lorem dolor cillum eu ex veniam sint consequat incididunt. Minim mollit reprehenderit mollit sint laboris consequat. website: 'sulfax.com'  image: 'http://placehold.it/32x32'  labels:  - 'green'  - 'yellow'  - 'blue'  labels_link:  - 'http://sulfax.com/labels/green'  - 'http://sulfax.com/labels/yellow'  - 'http://sulfax.com/labels/blue' --- 
0
Вы читали это? https://www.simple-talk.com/sysadmin/powershell/getting-data-into-and-out-of-powershell-objects/ SadBunny 8 лет назад 0
@ Садбани, да, у меня есть Ishan 8 лет назад 0
Похоже, что это полная реализация для ваших конкретных целей. Нет? SadBunny 8 лет назад 0
@ СадБанни, Нет, эта статья не делает именно то, что я хочу. Смотрите мой обновленный вопрос. Ishan 8 лет назад 0
Ну, это, безусловно, очень специфическая функция ... Итак, вы хотите разделить входящие данные на один или несколько файлов, где имя файла зависит от значения конкретного ключа? Это будет означать, что вы должны адаптировать свой текущий код, чтобы сделать именно это. Если вы не знаете, как это сделать, возможно, стоит опубликовать код в переполнении стека и попросить помочь изменить код в соответствии с вашими функциями. Вероятно, это не так сложно, вам придется разделить объекты YAML, пройтись по ним, получить значение и затем сохранить эту вещь. Возможный ярлык - это массивное регулярное выражение поиска и замены в общем результате. SadBunny 8 лет назад 0
Кстати, вы не должны начинать и заканчивать свой yaml с "---", yaml только * начинается * с "---". Следующий «---» - это начало следующего блока. SadBunny 8 лет назад 0
Я парень из Linux, так что вот пример, если вы передадите этот yaml через следующий скрипт gawk, он делает то, что вы хотите :) Не знаю, полезно ли это, но я проверил, и это работает: moo @monsterkill: / tmp $ cat test.txt | gawk -f test.gawk Написал файл: labour minim qui nisi esse не написал Файл: adipisicing mollit esse aliquip ullamco nisi labour Написал файл: non minim anim irure nulla ad elit SadBunny 8 лет назад 0
BEGIN content = content "" $ 0 "\ n"; if ($ 0 ~ "title:") } END { writeTheFile ();} функция writeTheFile () else } SadBunny 8 лет назад 0
Извините, представьте ваши собственные новые строки, как SU убил их: / SadBunny 8 лет назад 0
Не могли бы вы включить свой скрипт gawk в github gist. Это очень трудно читать в данный момент. Ishan 8 лет назад 0
Конечно, вот и вы: https://gist.github.com/SadBunny/a2d0f5421eb660096896f22cbbc46e4a SadBunny 8 лет назад 0
@SadBunny, когда я запускаю ваш скрипт на git bash для windows, он просто создает файл `non minim anim irure nulla ad elit.yaml` со всеми данными в формате yaml в качестве содержимого, а не того, что мне нужно. Однако запуск того же скрипта в Linux делает именно то, что вы сказали. Ishan 8 лет назад 0
Вероятно, вопрос новой строки. SadBunny 8 лет назад 0

1 ответ на вопрос

1
Ishan

Я отвечаю на свой вопрос в случае, если кто-то еще ищет ответ.

$obj = ($json | ConvertFrom-Json)  ForEach($item in $obj) { $filename = "$($item.title).yaml" $item | ConvertTo-YAML > $filename "---" >> $filename } 
Это очень мило :) Отличная работа. SadBunny 8 лет назад 0