Home > other >  (PowerShell) How to remove double quotes from the JSON output?
(PowerShell) How to remove double quotes from the JSON output?

Time:09-29

Here's an excerpt from my PowerShell script, that writes JSON data to a file:

$jsonData = @"
{
    "FunctionName" :
    {
        "description": "",
        "parameters": [],
        "signature" : ""
    }
}
"@

$jsonParameterData = @"
{
    `t`t`t`t`t`t`t`t`t`t"description": "", 
    `t`t`t`t`t`t`t`t`t`t"name": ""
    `t`t`t`t`t`t`t`t`t  }
"@

$jsonData = $jsonData | ConvertFrom-Json

In the code above I have defined the JSON template that I will use to write to the file. I'm using jsonData to describe the function FunctionName with the keys of description, parameters, and signature.

On the other hand, I'm using jsonParameterData to describe each argument of the function FunctionName with the keys of description and name.

My PowerShell script pulls the data from other files, and writes this JSON information to a .json file.

For example, if the signature of the function I want to extract data from is Function FunctionName(Parameter1, Parameter2), in the .json file I would expect to see this:

"FunctionName":  {
                      "description":  "This function does this and that",
                      "parameters":  [
                                         {
                                            "description": "This is the first parameter", 
                                            "name": "Parameter1"
                                          },
                                         {
                                            "description": "This is the second parameter", 
                                            "name": "Parameter2"
                                          }
                                     ],
                      "signature":  "Function FunctionName(Parameter1, Parameter2)"
                  }

Somewhere in the code, I store the number of function arguments in the variable NumberOfArguments; the arguments of the function in ArrayOfArguments, and the argument descriptions in ArrayOfArgumentDescriptions.

The PowerShell code below is used to add jsonParameterData to jsonData:

for($i=0; $i -lt $NumberOfArguments; $i  ){
    $SelectedArgument = $ArrayOfArguments[$i]
    $SelectedDescription = $ArrayOfArgumentDescriptions[$i]
    $jsonData.AplusWait.parameters  = $jsonParameterData
}

Then, I write jsonData to the file like this:

$jsonData = $jsonData | ConvertTo-Json | ForEach-Object { [System.Text.RegularExpressions.Regex]::Unescape($_) }
$jsonData.Substring(1, $jsonData.length - 2) | Add-Content -Path $OutputFile
Write-Output "`nFinished writing JSON data to file.`n"

However, the resulting output slightly does not match the intended output. The output looks like this:

"FunctionName":  {
                      "description":  "This function does this and that",
                      "parameters":  [
                                         "{
                                            "description": "This is the first parameter", 
                                            "name": "Parameter1"
                                          }",
                                         "{
                                            "description": "This is the second parameter", 
                                            "name": "Parameter2"
                                          }"
                                     ],
                      "signature":  "Function FunctionName(Parameter1, Parameter2)"
                  }

If you look closely, the output displays the parameters array as an array of strings (note the double quotes), when it should actually be an array of JSON objects.

How can I transform this:

"{
    "description": "This is the first parameter", 
    "name": "Parameter1"
}"

into this:

{
    "description": "This is the first parameter", 
    "name": "Parameter1"
}

?

CodePudding user response:

Having the following JSONs:

$jsonData = @"
{
  "foo": {
    "des": "foo-des",
    "par": [],
    "sig": "foo-sig"
  }
}
"@

$jsonParamData = @"
{
  "des": "param-des",
  "name": "param-name"
}
"@

$jsonObj = $jsonData | ConvertFrom-Json
$jsonParamObj = $jsonParamData | ConvertFrom-Json

# add param
$jsonObj.foo.par  = $jsonParamObj

# Pay attention to the -Depth parameter otherwise the final json will be truncated
$jsonResult = $jsonObj | ConvertTo-Json -Depth 5
Write-Host $jsonResult

Should print:

{
  "foo": {
    "des": "foo-des",
    "par": [
      {
        "des": "param-des",
        "name": "param-name"
      }
    ],
    "sig": "foo-sig"
  }
}
  • Related