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.
Folgender Schnipsel ist soweit fürs Testen:
Dann schaut die Ausgabe aber total Grütze aus:
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
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
Please also mark the comments that contributed to the solution of the article
Content-ID: 653071
Url: https://administrator.de/contentid/653071
Printed on: December 12, 2024 at 02:12 o'clock
4 Comments
Latest comment
Moin,
damit das Lernziel auch erreicht wird, hier was zum Lesen.
http://techgenix.com/json-with-powershell/
https://www.windowspro.de/script/json-powershell-erzeugen-bearbeiten
hth
Erik
damit das Lernziel auch erreicht wird, hier was zum Lesen.
http://techgenix.com/json-with-powershell/
https://www.windowspro.de/script/json-powershell-erzeugen-bearbeiten
hth
Erik
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
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:
Hiermit wird dem $JsonBaseObj eine Spalte namens Serviceblock mit dem $jsonBlockObjEmptyContent als Wert hinzugefügt.
Anschließend fügst du mit
quasi dem $jsonBlockObjEmptyContent eine Spalte "HerstellerA" mit sich selbst als Wert Hinzu,
Ergebnis:
Generell würde ich bei dieser Aufgabe eigentlich eher mit Hashtables arbeiten und diese hinterher in Json konvertieren
Gruß Thomas
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)
Anschließend fügst du mit
$jsonBaseObj.ServicesBlock.Add("HerstellerA", $jsonBlockObjEmptyContent)
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