Windows PowerShell's ConvertTo-Json
unexpectedly serializes &
to its equivalent Unicode escape sequence (\u0026
); ditto for '
, <
and >
(fortunately, this no longer happens in PowerShell (Core) 7+) - while unexpected and hindering readability - this isn't a problem for programmatic processing, since JSON parsers, including ConvertFrom-Json
do recognize such escape sequences:
($json = 'a & b' | ConvertTo-Json) # -> `"a \u0026 b"` (WinPS)
ConvertFrom-Json $json # -> verbatim `a & b`, i.e. successful roundtrip
If you do want to convert such escape sequences to the verbatim character they represent:
This answer to the linked question shows a robust, general string-substitution approach.
However, in your case - given that you know the specific and only Unicode sequence to replace and there seems to be no risk of false positives - you can simply use another -replace
operation:
$getvalue= 'true&replicaSet=users-shard-0&authSource=adsfsdfin&readPreference=neasrest&maxPoolSize=50&minPoolSize=10&maxIdleTimeMS=60'
$getvalue = $getvalue -replace '&','&'
# Simulate reading an object from a JSON
# and update one of its properties with the string of interest.
$a = [pscustomobject] @{
connectionStrings = [pscustomobject] @{
serverstring = $getValue
}
}
# Convert the object back to JSON and translate '\\u0026' into '&'.
# ... | Set-Content omitted for brevity.
($a | ConvertTo-Json) -replace '\\u0026', '&'
Output (note how the \u0026
instance were replaced with &
):
{
"connectionStrings": {
"serverstring": "true&replicaSet=users-shard-0&authSource=adsfsdfin&readPreference=neasrest&maxPoolSize=50&minPoolSize=10&maxIdleTimeMS=60"
}
}
You can cover all problematic characters - &
'
, <
and >
- with multiple -replace
operations:
- However, if you need to rule out false positives (e.g.,
\\u0026
), the more sophisticated solution from the aforementioned answer is required.
# Note: Use only if false positives aren't a concern.
# Sample input string that serializes to:
# "I\u0027m \u003cfine\u003e \u0026 dandy."
($json = "I'm <fine> & dandy." | ConvertTo-Json)
# Transform the Unicode escape sequences for chars. & ' < >
# back into those chars.
$json -replace '\\u0026', '&' -replace '\\u0027', "'" -replace '\\u003c', '<' -replace '\\u003e', '>'