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-Key: 653071

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

Printed on: April 19, 2024 at 05:04 o'clock

Member: erikro
erikro Feb 17, 2021 at 17:34:05 (UTC)
Goto Top
Member: H41mSh1C0R
H41mSh1C0R Feb 18, 2021 at 15:49:23 (UTC)
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
Mitglied: 147669
Solution 147669 Feb 19, 2021 updated at 11:25:10 (UTC)
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
Member: TK1987
Solution TK1987 Feb 19, 2021 updated at 11:27:25 (UTC)
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