Melon Man
Melon Man

Reputation: 185

Inputting JSON data in Powershell

Currently, I'm attempting to call upon an API to run a POST, with JSON data as the body. So I was wondering if anyone would be able to tell me how I need to format the text below inside the variable $postParams. I'm pretty new at working with JSON so I'm having so trouble with this.

Currently, I only have the following and don't know what to do about the second line on.

$postParams = @{name='Example'}

Here's is the entire data I was hoping to add to $postParams. So if you could help me with the 2nd, 4th, and 8th that'd be awesome. Thanks!

{
    "name":"Example",
    "template":{"name":"Template"},
    "url":"http://localhost",
    "page":{"name":"Landing Page"},
    "smtp":{"name":"Sending Profile"},
    "launch_date":"2019-10-08T17:20:00+00:00",
    "send_by_date":null,
    "groups":[{"name":"test group"}]
}

Upvotes: 2

Views: 5167

Answers (3)

Moerwald
Moerwald

Reputation: 11254

You'll need a here-string and ConvertFrom-Json.

here-string:

Quotation marks are also used to create a here-string. A here-string is a single-quoted or double-quoted string in which quotation marks are interpreted literally. A here-string can span multiple lines. All the lines in a here-string are interpreted as strings, even though they are not enclosed in quotation marks.

The resulting code:

# Use a PowerShell here string to take JSON as it is
$jsonString = @"
{
    "name":"Example",
    "template":{"name":"Template"},
    "url":"http://localhost",
    "page":{"name":"Landing Page"},
    "smtp":{"name":"Sending Profile"},
    "launch_date":"2019-10-08T17:20:00+00:00",
    "send_by_date":null,
    "groups":[{"name":"test group"}]
}
"@

# Pipe the string to create a new JSON object
$jsonObject = $jsonString | ConvertFrom-Json

# The resulting JSON object has properties matching the properties in the orig. JSON
$jsonObject.name
$jsonObject.url

# Nested property
$jsonObject.template.name

# Nested property in array
$jsonObject.groups[0].name

I've posted an online version of the above code at tio.run, so you can play around with it.

If you want to update several properties of the $jsonObject you can do the following:

 $jsonObject.name = "NEW NAME"
 $jsonObject.url = "NEW URL"

 $jsonObject | ConvertTo-Json

ConvertTo-Json will take your object and create an appropriate JSON string:

{
  "name": "NEW NAME",
  "template": {
    "name": "Template"
  },
  "url": "NEW URL",
  "page": {
    "name": "Landing Page"
  },
  "smtp": {
    "name": "Sending Profile"
  },
  "launch_date": "2019-10-08T17:20:00+00:00",
  "send_by_date": null,
  "groups": [
    {
      "name": "test group"
    }
  ]
}

If you $jsonObject has more than two levels of depth, use the -Depth parameter, otherwise not all object information will be included in the JSON string.

ConvertTo-Json:

-Depth

Specifies how many levels of contained objects are included in the JSON representation. The default value is 2.

Here is a tio.run link to a ConvertTo-Json example.

Hope that helps.

Upvotes: 4

Dustin
Dustin

Reputation: 326

Make a hashtable, then convert to JSON:

    $Hashtable = @{
        Key1 = "Value1"
        Key2 = "Value2"
    }

    $Json = $Hashtable | ConvertTo-Json

Upvotes: 0

Bryceson K
Bryceson K

Reputation: 36

I can't test it currently, but try this.

$postParams = @'
{
    "name":"Example",
    "template":{"name":"Template"},
    "url":"http://localhost",
    "page":{"name":"Landing Page"},
    "smtp":{"name":"Sending Profile"},
    "launch_date":"2019-10-08T17:20:00+00:00",
    "send_by_date":null,
    "groups":[{"name":"test group"}]
}
'@

Upvotes: 0

Related Questions