none
Komplexe JSON Umwandeln RRS feed

  • Allgemeine Diskussion

  • Moin Leute,

    Ich stehe was Powershell angeht noch am Anfang. Also bitte nicht so hart sein, wenn es eine dumme Frage ist ;)

    Ich nutze Powershell um JSON Informationen die ich über eine REST Schnittstelle bekomme, umzuwandeln und in einer CSV auszugeben. Insgesamt funktioniert das gerade bei einfachen JSON Informationen ziemlich gut. Nun soll ich einen neuen Service anbinden und die JSON File ist ne ganze Ecke "komplexer" (weil stärker verschachtelt) als die bisherigen Files. Die Files sind vergleichbar mit dieser Struktur aufgebaut:

    1.JSONObject
    2. JSON Object
    2.1. JSON Object
    2.2. JSON Object
    2.3. JSON Array
    3.1. JSON Array
    3.1.1. JSON Object
    3.1.2 JSON Object
    4.JSONObject
    4.1.1. JSONObject
    4.1.1.1. JSONObject
    4.1.1.2. JSONObject

    Wenn ich nun die ConvertFrom-JSON Funktion nutze, wandelt er die JSON Werte der ersten Ebene gut um. Aber bereits die zweite Ebene ist nur noch ein String Value der ersten Ebene. Nun möchte allerdings aus den unterschiedlichen Hierarchien ebenen Informationen exportieren. Folgenden Befehl nutze ich:

    (Get-Content C:\Rest.json -Raw | ConvertFrom-Json) | Export-CSV -Append -NoTypeInformation -Path "C:\Rest.csv"
     

    Wenn ich den Befehl nun um Select-Object erweitere kann ich nur Objekte aus der ersten Stufe selektieren. Die anderen Objekte werden nur als Strings in den Übergeordneten Objekten dargestellt. Wenn ich den Get-Content Befehl dahin gehend erweitere das ich einen verzweigten Objekt "auswähle" kann ich die unteren Hierarchien auswählen und exportieren:

    (Get-Content C:\Rest.json -Raw | ConvertFrom-Json).2.JsonObject | Export-CSV -Append -NoTypeInformation -Path "C:\Rest.csv"

    Da ich aus der JSON File aber aus unterschiedlichen Ebenen Informationen exportieren möchte, hilft mir das irgendwie nicht weiter. Klar ich könnte jetzt mehrere Powershell Befehle nutzen um die Informationen aus der Hierarchie zu kratzen und die hinterher wieder zu mergen, aber irgendwie glaube ich das es eine einfacher/bessere Lösung gibt. Ich habe am Wochenende reichlich gegoogelt um ein Ansatz zu finden, bin aber bisher nicht wirklich fündig geworden.

    Ideen?

    Danke + Gruss

    Timo

    Montag, 27. Februar 2017 09:18

Alle Antworten

  • Moin,

    nun, CSV ist ein zeilenbasiertes Format, d.h. jede Zeile umfasst einen kompletten Datensatz, sprich: alle Felder sind in jeder Zeile vorhanden und evtl. leer.

    Bei einer Datenstruktur, die als Properties Arrays (ggfls. sogar variabler Länge) umfasst, ist CSV schlicht und einfach kein Format, in dem man das sinnvoll abbilden kann.

    Und wenn's auf Teufel komm raus CSV sein muss, dann musst Du halt erst die gesamte Datenstruktur durchflöhen, die höchste Array-Länge bestimmen und dann entsprechend lange Zeilen mit entsprechend vielen Feldern anlegen.

    Wenn das ganze in eine relationale Datenbank überführt werden soll, lohnt es sich meistens, dies ohne einen Zwischenschritt einer flachen Textdatei zu tun. Für Archov- oder Transportzwecke kann man CLIXML statt CSV nehmen, das nimmt die Objektstruktur mit, nicht nur die Daten.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Montag, 27. Februar 2017 12:20
  • Mhm wenn ich das richtig lese, glaube ich, es geht bei seiner Frage weniger um den Export als CSV, als darum die Information "einfach" aus den unteren Ebenen der JSON Struktur zu extrahieren.
    Falls ja, bräuchte man mal ein kurzes Beispiel JSON und eine genaue Beschreibung an welcher Stelle es hängt.
     
    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Dienstag, 28. Februar 2017 11:38
    Moderator