sunnyrainyday
Goto Top

Json, Powershell und Arrays

Moin Zusammen,

Mit Sicherheit gibt es hier jemanden der mir mit meinem Powershell-Problem behilflich sein kann face-smile

Ich stehe wieder vor einem Problem und komme nicht weiter. Weiter unten findet Ihr eine .json Datei mit Inhalt "Buch1" und "Buch2" die mit Keys und Werten gefüllt sind.
Ich möchte nun ein weiteres Array mit einem 3. Buch(Buch3) mit den Keys und Werten füllen. Die Funktion die ich erstellt habe geht nicht da es die Eigenschaft "Buch3" für das Objekt nicht gefunden wurde.

Wie bewerkstellige ich das am besten? Vielen Dank.

.json:
{
    "Buch1":  [  
                  {
                      "Titel":  "Spawn"  
                  },
                  {
                      "Autor":  " Todd McFarlane"  
                  }
              ],
    "Buch2":  [  
                  {
                      "Titel":  "Spiderman"  
                  },
                  {
                      "Autor":  "Stan Lee"  
                  }
              ]
}

PS Funktion:
function Add {
    $NewKeyName = "Titel"  
    $NewKeyValue = "X-men"  
    $NewKeyName1 = "Autor"  
    $NewKeyValue1 = "Sten Lee"  
    $Block = "Buch3"  
    $jsonfile = "C:\test\config.json"  
    $json = Get-Content $jsonfile | ConvertFrom-json
    $json.$Block += @{$NewKeyName=$NewKeyValue}
    $json.$Block += @{$NewKeyName1=$NewKeyValue1}
    $json | ConvertTo-Json | Set-Content $jsonfile
}


Vielen Dank im Voraus!

Content-ID: 366068

Url: https://administrator.de/contentid/366068

Ausgedruckt am: 23.11.2024 um 01:11 Uhr

colinardo
Lösung colinardo 26.02.2018 aktualisiert um 11:53:22 Uhr
Goto Top
Servus @SunnyRainyDay ,
machst für deinen im Thread geposteten JSON Aufbau so
#......
$json | Add-Member -MemberType NoteProperty -Name "Buch3" -Value @([pscustomobject]@{Titel="TitelXYZ"},[pscustomobject]@{Autor="Max Muster"})  
# .....
Nach einem Convert mit ConvertFrom-JSON hast du ja erst einmal ein PSCustomObjekt, und um diesem weitere Eigenschaften zu verpassen nutzt du hier Add-Member mit dem Buchnamen als Name der Eigenschaft und als Value ein Array aus weiteren CustomObjects.

$string = @"  
{
    "Buch1":  [  
                  {
                      "Titel":  "Spawn"  
                  },
                  {
                      "Autor":  " Todd McFarlane"  
                  }
              ],
    "Buch2":  [  
                  {
                      "Titel":  "Spiderman"  
                  },
                  {
                      "Autor":  "Stan Lee"  
                  }
              ]
}
"@  

$json = $string | ConvertFrom-Json
$json | Add-Member -MemberType NoteProperty -Name "Buch3" -Value @([pscustomobject]@{Titel="TitelXYZ"},[pscustomobject]@{Autor="Max Muster"})  
$json | ConvertTo-Json
Ergebnis:
{
    "Buch1":  [
                  {
                      "Titel":  "Spawn"
                  },
                  {
                      "Autor":  " Todd McFarlane"
                  }
              ],
    "Buch2":  [
                  {
                      "Titel":  "Spiderman"
                  },
                  {
                      "Autor":  "Stan Lee"
                  }
              ],
    "Buch3":  [
                  {
                      "Titel":  "TitelXYZ"
                  },
                  {
                      "Autor":  "Max Muster"
                  }
              ]
}
Grüße Uwe
SunnyRainyDay
SunnyRainyDay 26.02.2018 um 12:22:32 Uhr
Goto Top
Hallo Uwe,

vielen Dank! face-smile Das war´s und funktioniert blendendface-smile Da ich scheinbar an den richtigen geraten bin, wie würdest du das gleiche nur mit löschen und verändern von Arrays und deren Inhalten vorgehen? Da werkle ich schon schon ne Weile dran aber komme auch da nicht weiter.

Danke im Voraus

Jaro
colinardo
colinardo 26.02.2018 aktualisiert um 12:34:49 Uhr
Goto Top
Zitat von @SunnyRainyDay:
wie würdest du das gleiche nur mit löschen und verändern von Arrays und deren Inhalten vorgehen? Da werkle ich schon schon ne Weile dran aber komme auch da nicht weiter.
Ganze Bücher so
$json.PSObject.Members.Remove("Buch2")  
Einzelne Subobjects in den Arrays
$json.Buch2.PSObject.Members.Remove("Titel")  
usw.
SunnyRainyDay
SunnyRainyDay 26.02.2018 um 13:20:12 Uhr
Goto Top
Danke face-smile

geht das löschen auch ohne Index? Gibt es auch eine Möglichkeit nur mit dem Keynamen zu löschen?
Beispiel
$json.Buch2.PSObject.Members.Remove("Autor")  
funktioniert leider nicht.
Danke nochmals.
colinardo
colinardo 26.02.2018 aktualisiert um 14:40:51 Uhr
Goto Top
Klar, ist ja immer ein Array, also Foreach-Schleife dazwischen schalten.
$json.Buch2 | %{$_.PSObject.Members.Remove("Autor")}  
SunnyRainyDay
SunnyRainyDay 27.02.2018 um 11:03:46 Uhr
Goto Top
Vielen Dank nochmal face-smile Hab noch viel zu lernen.