powershellconvertto-json

ConverTo-Json altering intended output


I have a psobject that is created from the JSON output of an Invoke-RestMethod. My intention is to change one value, convert back to JSON, then add back to the application REST API with another Invoke-RestMethod. I have done this several times in the past with the same REST API so I'm not sure why this one isn't working.

The psobject $restOut looks like this:

id: 123
limit: @{limitMb=0; limitPercent=0}

The next block of code changes the id if the new id I want isn't already set

$newId = 456
if($restOut.id -ne $newId){
   $restOut.id = $newId
   $inputJson = $restOut | ConvertTo-Json -Depth 2
   Invoke-RestMethod -Uri $restURl -Method PUT -Body $inputJson
}

I'm expecting $inputJson to look like this (and the psobject $restOut does match the expectation):

{
   "id": "456",
   "limit": {
               "limitMb": 0,
               "limitPercent": 0
            }
}

But what I'm actually getting is:

{
   "id":  {
             "value": "456",
             "id": "456"
          },
   "limit": {
               "limitMb": 0,
               "limitPercent": 0
            }
}

As said, I've done this exact manipulation many times in other scripts targeting the same software API, and am just at a loss with the behavior this time. Any help is appreciated. Thanks!


Solution

  • Easy fix

    This was a simplified sample. In my actual script $newId = 456 was actually being assigned from another API call. Therefore it was also an object. Simply quoting it in the line that changes the id to make it a string fixed the issue:

    $restOut.id = "$newId"
    

    instead of

    $restOut.id = $newId