2016-06-24 6 views
5

Ich verwende PowerShell, um eine POST Anfrage an eine REST API zu senden. Der Körper der Anfrage sieht wie folgt aus:Wie kann ich eine HashTable korrekt in PowerShell in JSON konvertieren?

{ 
    "title": "game result", 
    "attachments": [ 
        { 
         "image_url": "http://contoso/", 
         "title": "good work!" 
        }, 
        { 
         "fields": [ 
          { 
           "title":"score", 
           "value":"100" 
           }, 
           { 
           "title":"bonus", 
           "value":"50" 
           } 

         ] 
        } 
       ] 
} 

Nun wird das folgende Powershell-Skript die falsche Ausgabe erzeugt:

$fields = @(@{title='score'; value='100'},@{title='bonus'; value='10'}) 
$fieldsWrap = @{fields=$fields} 
#$fieldsWrap | ConvertTo-Json 
$attachments = @(@{title='good work!';image_url='http://contoso'},$fieldsWrap) 
$body = @{title='game results';attachments=$attachments} 
$json = $body | ConvertTo-Json 
$json 

Linie 3 (wenn unkommentiert) erzeugt die korrekte Ausgabe jedoch Linie 7 erzeugt:

{ 
"attachments": [ 
        { 
         "image_url": "http://contoso", 
         "title": "good work!" 
        }, 
        { 
         "fields": "System.Collections.Hashtable System.Collections.Hashtable" 
        } 
       ], 
"title": "game result" 

}

Es schreibt offenbar aus dem Typnamen der 012., das ist die Standard ToString() Implementierung ich nehme an.
Wie bekomme ich die richtige Ausgabe?

Antwort

7

Das ConvertTo-Json cmdlet hat einen Parameter, der -depth:

Gibt an, wie viele Ebenen der enthaltenen Objekte in der JSON Repräsentation enthalten sind. Der Standardwert ist 2.

Damit Sie es erhöhen müssen:

$body | ConvertTo-Json -Depth 4 
+1

So hilfreich! Ich habe eine PowerShell-Aktivität für ein grafisches Runbook von Azure OMS Automation geschrieben, um eine Nachricht an einen Slack-Kanal zu senden. –

0

Dies gibt dem JSON Ausgabe, die Sie wollen:

@{ 
    title = "game result"  
    attachments = @(
     @{ 
      image_url = "http://contoso/" 
      title = "good work!" 
     }, 
     @{ 
      fields = @(
       @{ 
        title = "score" 
        value = "100" 
       }, 
       @{ 
        title = "bonus" 
        value = "50" 
       } 
      ) 
     } 
    ) 
} | ConvertTo-Json -Depth 4 

Wäre nicht ohne Martin Brandl gearbeitet Beratung, obwohl :)

Verwandte Themen