Ich versuche, eine JSON-Datei in Powershell aufzunehmen, einen Block von JSON an einen vorhandenen Knoten (Komponenten) anzufügen, das PSCustomObject dann wieder in JSON zu konvertieren und die Datei zu speichern. Der JSON, mit dem ich spiele, sieht ungefähr wie Abbildung 1 aus.PSCustomObjects innerhalb des Arrays kann nicht korrekt in JSON konvertiert werden
Wie Sie in meinem Code sehen, führe ich ConvertTo-Json aus, um die Daten in ein PSCustomObject umzuwandeln, und anschließend ein neues Objekt an den Knoten Komponenten. Wenn ich das Objekt, $ configFile, in diesem Fall anschaue, sieht alles gut aus, aber wenn ich wieder in JSON konvertiere, werden die Elemente im Knoten Komponenten als Strings behandelt und nicht in JSON ausgewertet (siehe letztes Snippet). Ich stelle mir das vor, weil ConvertTo-JSON Arrays buchstäblich, aber nicht 100% sicher behandelt.
Wenn jemand angeben kann, wie sichergestellt wird, dass die PSCustomObjects im Komponentenknoten ordnungsgemäß an JSON übergeben werden, wäre ich Ihnen dankbar, danke.
Figur 1 - die ursprüngliche JSON:
{
"EngineConfiguration": {
"PollInterval": "00:00:15",
"Components": [
{
"Id": "ApplicationEventLog",
"FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
"Parameters": {
"LogName": "Application",
"Levels": "1"
}
},
{
"Id": "SystemEventLog",
"FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
"Parameters": {
"LogName": "System",
"Levels": "7"
}
}
],
"Flows": {
"Flows":
[
"(ApplicationEventLog,SystemEventLog),CloudWatchLogs"
]
}
}
}
Abbildung 2 - mein Code:
#Requires -Version 3.0
$configFile = "C:\Program Files\Amazon\EC2ConfigService\Settings\AWS.EC2.Windows.CloudWatch.json"
$configToPSObject = ConvertFrom-Json "$(Get-Content $configFile)"
$configToPSObject.EngineConfiguration.Components += New-Object -Type PSObject -Property ([ordered]@{
"Id" = "IISRequestQueueSize"
"FullName" = "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch"
"Parameters" = [PSCustomObject]@{
"CategoryName" = "HTTP Service Request Queues"
"CounterName" = "CurrentQueueSize"
"InstanceName" = "_Total"
"MetricName" = "IISRequestQueueSize"
"Unit" = ""
"DimensionName" = ""
"DimensionValue" = ""
}
})
$configJson = ConvertTo-Json -Depth 5 $configToPSObject
Set-Content -Path $configFile -Value $configJson
Figur 3 - der JSON Ausgang:
{
"EngineConfiguration": {
"PollInterval": "00:00:15",
"Components": [
"@{Id=ApplicationEventLog; FullName=AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch; Parameters=}",
"@{Id=SystemEventLog; FullName=AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch; Parameters=}",
"@{Id=IISRequestQueueSize; FullName=AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch; Parameters=}"
],
"Flows": {
"Flows":
"(ApplicationEventLog,SystemEventLog),CloudWatchLogs"
}
}
}
Wenn erhöhe ich die Tiefe zu sagen, 8 oder darüber hinaus, der JSON kommt wie folgt heraus:
{
"EngineConfiguration": {
"PollInterval": "00:00:15",
"Components": [
"@{Id=ApplicationEventLog; FullName=AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch; Parameters=}",
"@{Id=SystemEventLog; FullName=AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch; Parameters=}",
"Id": "IISRequestQueueSize",
"FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
"Parameters": {
"CategoryName": "HTTP Service Request Queues",
"CounterName": "CurrentQueueSize",
"InstanceName": "_Total",
"MetricName": "IISRequestQueueSize",
"Unit": "",
"DimensionName": "",
"DimensionValue": ""
}
}
],
"Flows": {
"Flows": "(ApplicationEventLog,SystemEventLog),CloudWatchLogs"
}
}
}
Hmm, nur Konvertierung von JSON und Konvertierung zurück in JSON erzeugt eine Liste von serialisierten Objekten anstelle von JSON-Syntax-Objekten. Seltsam. – Vesper