JSON als Template "verdünnen"?
Ich habe eine JSON mit über 18.000 Zeilen und würde gerne die Arrays so ausdünnen, dass am Schluss jedes JSON Attribut nur einmal vertreten ist, damit ich dieses JSON in "einfach" habe, damit die Erstellung von Grafen nicht so umständlich ist und der Ersteller nicht erstmal durch die tausenden Zeilen fühlen muss.
Gibt es da einen Generator, Code Snippet oder ähnliches, welches mir das vereinfacht?
Nachfragen gerne in die Antwort integrieren. Der Nachfragebereich ist zu kurz.
Kurzum treten entsprechend zig Ressourcen unter einem JSON Objekt auf, von welchen es viele gibt. Ich will aber nicht "viele", sondern nur ein Einziges von jedem Typ.
Kannst du bitte ein kurzes Beispiel bringen? Du verwendest hier Begriffe ziemlich durcheinander. Array, Attribut...?
{
"MAttri":[
{"Attribut": "Wert1"},
{"Attribut": "Wert2"}],
"MAttri":[
{"Attribut": "Wert1"},
{"Attribut": "Wert2"}]
}
Ich bräuchte das 2. "MAttri" nicht
3 Antworten
bist Du Dir sicher, das Dein JSON so aussieht? Das soll ja sicher ein Array of Objects sein? Ein Object welches mehrfach die gleiche Property "Mattri" enthält ist nicht möglich.
In Deinem Fall würde bei der Wandlung in ein Object lediglich in jedem Schritt der Property Mattri das aktuell object-Array [ {"Attribut": "Wert1"}, {"Attribut": "Wert2"}] zugewiesen. siehe Powershelldemo:
$TestJson= '
{
"MAttri":[
{"Attribut": "Wert1"},
{"Attribut": "Wert2"}],
"MAttri":[
{"Attribut": "Wert1"},
{"Attribut": "Wert2"}],
"MAttri":[
{"Attribut": "Wert1"},
{"Attribut": "Wert3"}]
}
'
$TestJson|ConvertFrom-Json
Folgendermaßen würde ein schuh draus:
$testJSON='
[
{
"Matrix": [
{
"Attribut": "Wert1"
},
{
"Attribut": "Wert7"
}
]
},
{
"Matrix": [
{
"Attribut": "Wert1"
},
{
"Attribut": "Wert7"
}
]
},
{
"Matrix": [
{
"Attribut": "Wert2"
},
{
"Attribut": "Wert7"
}
]
},
{
"Matrix": [
{
"Attribut": "Wert1"
},
{
"Attribut": "Wert5"
}
]
},
{
"Matrix": [
{
"Attribut": "Wert9"
},
{
"Attribut": "Wert2"
}
]
},
{
"Matrix": [
{
"Attribut": "Wert1"
},
{
"Attribut": "Wert7"
}
]
}
]
'
$testOpjArr=$testJSON|ConvertFrom-Json
Write-Host 'Ausgangsobject' -fo Green
$testOpjArr|fl *
#$testOpjArr |Sort-Object { $_.Matrix.Attribut }|fl *
Write-Host 'Alle Duplicate entfernt' -fo Green
$testOpjArr |Sort-Object { $_.Matrix.Attribut } -unique|fl *
$testOpjArr |Sort-Object { $_.Matrix.Attribut } -unique|ConvertTo-JSON
...damit fliegen sämtliche Duplikate raus.
Willst du nur aufeinander folgende Duplicate vernichten
Write-Host 'Aufeinander folgende Duplicate entfernt' -fo Green
$cleanedObjArr = $testOpjArr|%{$last=$Null}{
#das vergleichen von Objecten ist immer Pain in the Ass
#billiger Powershelltrick: einen vergleichsfähigen Output in einen String speichern
#bei diesem billigen object reicht Format-List Output
$CurredCompStr =$_|fl|Out-String
$LastCompStr =$Last|fl|Out-String
#...und die strings vergleichen
if ($CurredCompStr -ne $LastCompStr){
$_ #object zürckgeben ...oder nicht
}
$last=$_ #vergleichsobject merken
}
$cleanedObjArr|fl *
$cleanedObjArr|ConvertTo-JSON
statt meines statischen JsonStrings ist es billig aus/in einer Datei zu importieren: https://devblogs.microsoft.com/scripting/powertip-convert-json-file-to-powershell-object/
Ansonsten ist es eich möglich die Macht von Powershells Stringoperationen auszuspielen und jegliches Json als string zu zerlegen die Teile zu vergleichen und wieder zusammezusetzen.
aber heute nicht mehr...😴
mal auf die schnelle der Weg über brutale Stringakrobatik
$TestJson= '
{
"MAttri":[
{"Attribut": "Wert1"},
{"Attribut": "Wert2"}],
"MAttri":[
{"Attribut": "Wert1"},
{"Attribut": "Wert2"}],
"MAttri":[
{"Attribut": "Wert1"},
{"Attribut": "Wert3"}]
}
'
# setze um "zerstörungsfrei" zu splitten, einen markanten Delimite vor "MAttri"
#der letzte block soll aussehn wie die andern, also ein Komma dran und eiene Splitmarkierung
$TestJson=$TestJson -replace '("MAttri")','SplittMarker$1' -replace '(\}\])(\r\n)','$1,$2SplittMarker'
$SplitedTxt = $TestJson -split 'SplittMarker'
#entferne aufeinanderfolgende Dupletten
#selct -uniqe funktioniert nur mit primitiven Datentypen
($SplitedTxt|Select -unique) -join '' -replace '(\}\]),(\r\n\})','$1$2' #wieder einen String draus machen und das Letzte Komma entfernen
...allerdings ist das weniger flexibel als mit Objecten zu agieren und diese zu convertieren
Allein das platzieren der Delimiter bedarf etwas RegEX-Kunst (da genügt schon ein unscheinbares Leerzeichen und das Ding fliegt Dir um die Ohren)
Die übliche Allzweckwaffe für JSON ist jq.
Ich kann dir jetzt nicht ad hoc ein Kommando für genau deine Aufgabenstellung geben, aber eine kreative Google-Suche könnte dich hinbringen ("jq remove duplicate object members" o.ä.)
Sieht schon mal nicht schlecht aus. Schaue ich mir auf jeden Fall mal an!
Ich benutze für sowas gerne ChatGPT.
Für solche nervigen Aufgaben, die händisch u.A. unnötig lange dauern wie Tabellen sortieren, Werte umschreiben oder eben Jsons anpassen ist das echt gut.
Natürlich musst Du am Ende nocheinmal nachprüfen, ob alles so ist, wie Du es willst.
Aber generell funktioniert das ziemlich gut.
Ich benutze für sowas gerne ChatGPT.
Da komme ich mit den über 18.000 Zeilen leider weit über das Limit hinaus. ^^
Hoppla, den Teil habe ich glatt überlesen und eher auf das Beispiel in der Nachfrage geachtet. ^^
Soll vorkommen. :p
Hat mich aber soweit sehr gewundert, dass ich dazu auch online nichts finden konnte.
Ja, ich hatte mich leider vertippt, als ich das eingegeben habe. x)
Im Grunde möchte ich eben meine JSON wie ein Template haben, dass dort quasi so wenig Daten wie möglich, so viele wie nötig drinne sind. Da wären wir am Schluss vielleicht bei ein paar Hundert Zeilen, aber nicht 18.000. :D