h41msh1c0r
Goto Top

Powershell json object hinzufügen läuft schief

Aloa in die Runde,

mal wieder etwas Luft weiterzumachen. =)

So soll das Lernziel aussehen, bekomme ich allerdings noch nicht ganz gebacken.
{
    "ServicesBlock":  {  
                     "HerstellerA":  {  
                                    "Service1":  {  
                                                        "Name":  "TemplateName",  
                                                        "Value":  "TemplateName",  
                                                    },
                                    "Service2":  {  
                                                        "Name":  "TemplateName",  
                                                        "Value":  "TemplateName",  
                                                    },
                                    "Service3":  {  
                                                        "Name":  "TemplateName",  
                                                        "Value":  "TemplateName",  
                                                    },
                                },
                     "HerstellerB":  {  
                                    "Service1":  {  
                                                        "Name":  "TemplateName",  
                                                        "Value":  "TemplateName",  
                                                    },
                                    "Service2":  {  
                                                        "Name":  "TemplateName",  
                                                        "Value":  "TemplateName",  
                                                    },
                                    "Service3":  {  
                                                        "Name":  "TemplateName",  
                                                        "Value":  "TemplateName",  
                                                    },
                                 }
                 }
}

Folgender Schnipsel ist soweit fürs Testen:
Remove-Item -Path C:\temp\Json-Export\jsontestNEW.json

function ConvertFrom-Json([String]$sRawJson) {
    [System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions") `  
        | Out-Null
    $oJsSerializer = New-Object System.Web.Script.Serialization.JavaScriptSerializer
    return $oJsSerializer.DeserializeObject($sRawJson)
}

$EmptyContent = @"  
{
}
"@  

$DefinedContent = @"  
{
    "Name": "TemplateName",  
    "Value": "TemplateValue"  
}
"@  

$jsonBaseObj                    = ConvertFrom-Json($EmptyContent)
$jsonBlockObjEmptyContent   = ConvertFrom-Json($EmptyContent)
$jsonBlockObjDefinedContent = ConvertFrom-Json($DefinedContent)

$jsonBaseObj.Add("ServicesBlock", $jsonBlockObjEmptyContent)  

$jsonBaseObj.ServicesBlock.Add("HerstellerA", $jsonBlockObjEmptyContent)  
$jsonBaseObj.ServicesBlock.HerstellerA.Add("Service1", $jsonBlockObjDefinedContent)  
$jsonBaseObj.ServicesBlock.HerstellerA.Add("Service2", $jsonBlockObjDefinedContent)  
$jsonBaseObj.ServicesBlock.HerstellerA.Add("Service3", $jsonBlockObjDefinedContent)  

$jsonBaseObj.ServicesBlock.Add("HerstellerB", $jsonBlockObjEmptyContent)  
$jsonBaseObj.ServicesBlock.HerstellerB.Add("ServiceHerstellerB1", $jsonBlockObjDefinedContent)  
$jsonBaseObj.ServicesBlock.HerstellerB.Add("ServiceHerstellerB2", $jsonBlockObjDefinedContent)  
$jsonBaseObj.ServicesBlock.HerstellerB.Add("ServiceHerstellerB3", $jsonBlockObjDefinedContent)  

$jsonBaseObj |ConvertTo-Json > C:\temp\Json-Export\jsontestNEW.json

Remove-Variable $jsonBaseObj


Dann schaut die Ausgabe aber total Grütze aus:
{
    "ServicesBlock":  {  
                          "HerstellerA":  {  
                                              "HerstellerA":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "Service1":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "Service2":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "Service3":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "HerstellerB":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "ServiceHerstellerB1":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "ServiceHerstellerB2":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "ServiceHerstellerB3":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]"  
                                          },
                          "Service1":  {  
                                           "Name":  "TemplateName",  
                                           "Value":  "TemplateValue"  
                                       },
                          "Service2":  {  
                                           "Name":  "TemplateName",  
                                           "Value":  "TemplateValue"  
                                       },
                          "Service3":  {  
                                           "Name":  "TemplateName",  
                                           "Value":  "TemplateValue"  
                                       },
                          "HerstellerB":  {  
                                              "HerstellerA":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "Service1":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "Service2":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "Service3":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "HerstellerB":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "ServiceHerstellerB1":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "ServiceHerstellerB2":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]",  
                                              "ServiceHerstellerB3":  "System.Collections.Generic.Dictionary`2[System.String,System.Object]"  
                                          },
                          "ServiceHerstellerB1":  {  
                                                      "Name":  "TemplateName",  
                                                      "Value":  "TemplateValue"  
                                                  },
                          "ServiceHerstellerB2":  {  
                                                      "Name":  "TemplateName",  
                                                      "Value":  "TemplateValue"  
                                                  },
                          "ServiceHerstellerB3":  {  
                                                      "Name":  "TemplateName",  
                                                      "Value":  "TemplateValue"  
                                                  }
                      }
}


Davon mal abgesehen das .Add die Namen nur einmal vorkommen dürfen schachtelt er es nicht so wie gedacht und fügt die Einträge:
"xxxxxxx": "System.Collections.Generic.Dictionary`2[System.String,System.Object]" hinzu.

Warum?

VG

Content-ID: 653071

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

Ausgedruckt am: 04.12.2024 um 08:12 Uhr

erikro
erikro 17.02.2021 um 18:34:05 Uhr
Goto Top
H41mSh1C0R
H41mSh1C0R 18.02.2021 um 16:49:23 Uhr
Goto Top
Aloa Erik,

erklärt zwar nicht den Fehler der oben auftritt, aber dann Mischen wir hier mal lustig den Thread.

Aus dem ersten Link habe ich als einzig brauchbares den JSONLint Link gezogen.
Das reine Anhängen von Wertepaaren funktioniert. Das Anhängen von neuen "Blöcken" nicht.

Versuchen wir aber mal den Weg aus dem 2ten Link zu adaptieren:

$block = '  
[{
	"Services": {  
		"HerstellerA": {  
			"Service1": {  
				"Name": "ServiceA",  
				"Status": "running",  
				"visibility": "0"  
			},
			"Service2": {  
				"Name": "ServiceB",  
				"Status": "stopped",  
				"visibility": "1"  
			}
		}
	}
}]
'  

$block

$vPSObject = $block | ConvertFrom-Json

$vPSObject.Services.HerstellerA.Service1

$newSubBlock = '  
[
{
"ServiceX": {  
				"Name": "serviceX",  
				"Status": "running",  
				"visibility": "1"  
			}
}
]'  


$newService = $newSubBlock | ConvertFrom-Json

$newService

$vPSObject += $newService

$vPSObject.Services.HerstellerA

Ergebnis:
Service X wird nicht angehangen. Nicht mal auf der ersten Ebene und das ohne Fehler.
Wenn ich das tiefer versuche gibt es die Meldung "keine Methode op_Addition".

Fragezeichen bleibt aktuell bestehen.

VG
147669
Lösung 147669 19.02.2021 aktualisiert um 12:25:10 Uhr
Goto Top
Beispiel
$jsonobject = @{
    ServicesBlock = @{
        HerstellerA = @{
            Service1 = @{
                Name = "TemplateName"  
                Value = "TemplateName"  
            }
        }
        HerstellerB = @{
            Service1 = @{
                Name = "TemplateName"  
                Value = "TemplateName"  
            }
        }
    }
}


$newService = @{
    Name = "TemplateName"  
    Value = "TemplateName"  
}

$jsonobject.ServicesBlock.HerstellerA.Service2 = $newService
$jsonobject | ConvertTo-Json -Depth 100
TK1987
Lösung TK1987 19.02.2021 aktualisiert um 12:27:25 Uhr
Goto Top
Moin,

führe mal Zeile für Zeile in Powershell aus und schau dir das Ergebnis an, dann siehst du auch sofort, was das Problem ist:

$jsonBaseObj.Add("ServicesBlock", $jsonBlockObjEmptyContent)  
Hiermit wird dem $JsonBaseObj eine Spalte namens Serviceblock mit dem $jsonBlockObjEmptyContent als Wert hinzugefügt.
Anschließend fügst du mit
$jsonBaseObj.ServicesBlock.Add("HerstellerA", $jsonBlockObjEmptyContent)  
quasi dem $jsonBlockObjEmptyContent eine Spalte "HerstellerA" mit sich selbst als Wert Hinzu,
Ergebnis:

{
    "ServicesBlock":  {  
        "HerstellerA":  {  
            "HerstellerA":  {  
                "HerstellerA":  {  
                    "HerstellerA":  {  
                        ....

Generell würde ich bei dieser Aufgabe eigentlich eher mit Hashtables arbeiten und diese hinterher in Json konvertieren
$JSon = @{
  ServiceBlock = Foreach ($Hersteller in 'HerstellerA','HerstellerB') {@{  
    $Hersteller = Foreach ($Service in 'Service1','Service2','Service3') {@{  
      $Service = @{
        Name  = 'TemplateName'   
        Value = 'TemplateName'   
      }
    }}
  }}
}
$json | ConvertTo-Json -Depth 5 | Set-Content 'C:\temp\Json-Export\jsontestNEW.json'  

Gruß Thomas