Question:
providing I have the following JSON
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "firstName": "Frank", "lastName": "Smith", "age": "25", "address": { "streetAddress": "21 3rd st", "city": "New York", "state": "NY", "postalCode": "10021" }, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] } |
I need to be able to update a value using dotted notation.
1 2 3 4 5 6 7 8 9 10 |
$path = "C:\somePath\test.json" $node = "address.streetAddress" # should also work with "phoneNumber[0].number" $value = "21 Jump St." $config = Get-Content -Path $path -Raw | ConvertFrom-Json $config.$node = $value Write-Host $config.$node #Set-Content $path $($config | ConvertTo-Json) |
The problem I’m getting is that the property cannot be found.
Exception setting “address.streetAddress”: “The property ‘address.streetAddress’ cannot be found on this object. Verify that the property exists and can be set.”
What do I need to do to be able to pass in dotted notation, and update the appropriate value?
Answer:
While you can put a single property name in a variable and use that to access the property, you can’t do that for multiple, dotted properties. You can work around this by using Invoke-Expression:
1 2 |
Invoke-Expression "`$config.$node = `$value" |