JSON als Template "verdünnen"?


12.10.2023, 12:23

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.

jo135  12.10.2023, 12:14

Kannst du bitte ein kurzes Beispiel bringen? Du verwendest hier Begriffe ziemlich durcheinander. Array, Attribut...?

Dultus, UserMod Light  
Fragesteller
 12.10.2023, 12:19
{
  "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...😴


Dultus, UserMod Light  
Fragesteller
 12.10.2023, 18:19

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

1
Erzesel  12.10.2023, 19:36
@Dultus, UserMod Light

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)

0

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.ä.)


Dultus, UserMod Light  
Fragesteller
 12.10.2023, 12:28

Sieht schon mal nicht schlecht aus. Schaue ich mir auf jeden Fall mal an!

0

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.

Woher ich das weiß:Studium / Ausbildung – Informatik Studium.

Dultus, UserMod Light  
Fragesteller
 12.10.2023, 12:29
Ich benutze für sowas gerne ChatGPT.

Da komme ich mit den über 18.000 Zeilen leider weit über das Limit hinaus. ^^

0
Dultus, UserMod Light  
Fragesteller
 12.10.2023, 12:32
@apophis

Soll vorkommen. :p

Hat mich aber soweit sehr gewundert, dass ich dazu auch online nichts finden konnte.

0