Konvertieren Sie JSON in YAML mit PowerShell

1764
Ishan

Ich habe solche Json-Daten.

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"], } ] 

Wie konvertiere ich diese Json-Daten mithilfe von PowerShell in yaml, wobei jedes Json-Objekt in yaml konvertiert und in seiner eigenen Datei als yaml gespeichert wird, wobei der Dateiname der Wert der Eigenschaften der Titelschlüssel ist ?

Wenn ich den folgenden Befehl ausführe ($json | ConvertFrom-Json) | ConvertTo-YAML(wobei die ConvertTo-YAMLFunktion von der simpletalk-Website übernommen wird ), ist dies die Ausgabe, die ich bekomme.

Ausgabe

---  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' 

Die Ausgabe, nach der ich suche, würde jedoch so aussehen - wobei der Dateiname der Wert der Eigenschaften der Titelschlüssel ist und der Inhalt der Datei das entsprechende Json-Objekt sein soll, das in Yaml konvertiert wird.

minimis qui nisi esse amet 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' --- 

Mollit esse aliquip ullamco nisi laboris.yaml

--- 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
Hast du das gelesen? https://www.simple-talk.com/sysadmin/powershell/getting-data-into-and-out-of-powershell-objects/ SadBunny vor 7 Jahren 0
@SadBunny ja, ich habe Ishan vor 7 Jahren 0
Es scheint, als hätte dies eine vollständige Implementierung für Ihren genauen Zweck. Nein? SadBunny vor 7 Jahren 0
@SadBunny, Nein, dieser Artikel macht nicht genau das, was ich will. Siehe meine aktualisierte Frage. Ishan vor 7 Jahren 0
Nun, das ist sicherlich eine sehr spezifische Funktion ... Sie möchten also die eingehenden Daten in eine oder mehrere Dateien aufteilen, deren Dateiname vom Wert eines bestimmten Schlüssels abhängt? Das würde bedeuten, dass Sie Ihren aktuellen Code anpassen müssen, um genau das zu tun. Wenn Sie nicht wissen, wie es geht, ist es wahrscheinlich eine gute Idee, Ihren Code in den Stapelüberlauf zu stellen und um Hilfe zu bitten, wenn Sie den Code an Ihre Funktionalität anpassen. Es ist wahrscheinlich nicht so schwer, Sie müssten die YAML-Objekte aufteilen, durchlaufen, den Wert abrufen und dann das Ding speichern. Eine mögliche Abkürzung ist ein massiver Regex-Suchvorgang für das Gesamtergebnis. SadBunny vor 7 Jahren 0
Übrigens solltest du nicht anfangen UND dein yaml mit "---" beenden, nur yaml * beginnt * mit "---". Das nächste "---" ist der Beginn des nächsten Blocks. SadBunny vor 7 Jahren 0
Ich bin ein Linux-Typ, also hier ein Beispiel, wenn Sie das yaml durch das folgende Gawk-Skript pfeifen, dann tun Sie, was Sie wollen :) Ich weiß nicht, ob es von Nutzen ist, aber ich habe es getestet und es funktioniert: moo @ monsterkill: / tmp $ cat test.txt | gawk -f test.gawk Schrieb die Datei: laboris minim qui nisi esse amet nicht Schrieb die Datei: adipisicing mollit esse aliquip ullamco nisi laboris Schrieb die Datei: non minim anim irure nulla ad elit SadBunny vor 7 Jahren 0
BEGIN content = content "" $ 0 "\ n"; if ($ 0 ~ "title:") } END { writeTheFile ();} Funktion writeTheFile () else } SadBunny vor 7 Jahren 0
Tut mir Leid, stellen Sie sich Ihre eigenen Nachrichten vor, wie sie von SU getötet wurden: / SadBunny vor 7 Jahren 0
Könnten Sie bitte Ihr Gawk-Skript auf Github Gist hinzufügen. Es ist im Moment sehr schwer zu lesen. Ishan vor 7 Jahren 0
Sicher, hier gehts: https://gist.github.com/SadBunny/a2d0f5421eb660096896f22cbbc46e4a SadBunny vor 7 Jahren 0
@SadBunny, Wenn ich Ihr Skript auf git bash unter Windows starte, wird lediglich eine "non-minim-anim irulie ad elit.yaml" -Datei mit den gesamten Daten im yaml-Format erstellt, deren Inhalt nicht das ist, was ich suche. Das Ausführen des gleichen Skripts unter Linux führt jedoch genau zu dem, was Sie gesagt haben. Ishan vor 7 Jahren 0
Wahrscheinlich ein Newline-Problem. SadBunny vor 7 Jahren 0

1 Antwort auf die Frage

1
Ishan

Ich beantworte meine eigene Frage, falls jemand anderes nach einer Antwort sucht.

$obj = ($json | ConvertFrom-Json)  ForEach($item in $obj) { $filename = "$($item.title).yaml" $item | ConvertTo-YAML > $filename "---" >> $filename } 
Das ist ziemlich süß :) Gute Arbeit. SadBunny vor 7 Jahren 0