Como converter valor xml inteiro em JSON sem aspas

Oct 22 2020

Então, eu tenho meu xml como mostrado abaixo com o parâmetro 4 sendo um número inteiro e o resto sendo parâmetros de string. O problema é que o XML não me permite colocar o valor inteiro sem aspas (não gosta disso).

Ao convertê-lo para JSON, quero que o valor inteiro apareça sem as aspas.

<?xml version="1.0" encoding="utf-8"?>
<Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="application" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="Parameter1" Value="test1" />
    <Parameter Name="parameter2" Value="test2" />
    <Parameter Name="parameter3" Value="test3" />
    <Parameter Name="parameter4" Value="42" />
  </Parameters>
</Application>

Eu tenho uma tabela de hash aninhada (Obrigado @ mklement0 por me ajudar com isso)

    $hash = [ordered] @{} $appParametersXml.Application.Parameters.ChildNodes | % {
    $hash[$_.Name] = @{ value = $_.Value } } # Wrap the hashtable in a top-level hashtable and convert to JSON. [ordered] @{ '$schema' = 'https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#'
    contentVersion ='1.0.0.0'
    parameters = $hash } | ConvertTo-Json |Out-File $parameterJsonFile

A saída no arquivo JSON está correta, no entanto, o último valor ( 42) também está entre aspas. Existe uma maneira de especificar que um valor específico é um número inteiro?

Agradeço antecipadamente por sua ajuda :)

Respostas

1 mklement0 Oct 22 2020 at 15:25

XML é baseado em texto , portanto, quaisquer valores extraídos de um documento [xml]( System.Xml.XmlDocument) serão strings .

Para citar o comentário de Mathias R. Jessen sobre a questão: "A especificação XML é bastante clara sobre isso: Apenas literais de string e referências podem ser usados ​​como valores de atributo e devem ser delimitados com aspas simples ou duplas."

Se quiser que esses valores sejam de outros tipos , você deve realizar conversões explícitas .

Passar esses valores convertidos para ConvertTo-Jsonomitirá automaticamente as aspas se eles forem de um tipo representado sem aspas em JSON (números null, truee false)

No caso em questão, você pode usar -aso operador de conversão de tipo condicional para converter condicionalmente uma string em um número inteiro, se ela puder ser interpretada como tal:

# Sample XML input.
# Note the two "Value" attribute values, "test1" and "42".
[xml] $xmlDoc = @' <?xml version="1.0" encoding="utf-8"?> <Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="application" xmlns="http://schemas.microsoft.com/2011/01/fabric"> <Parameters> <Parameter Name="Parameter1" Value="test1" /> <Parameter Name="parameter4" Value="42" /> </Parameters> </Application> '@ # Transform the "Parameter" elements into a nested hashtable. # Convert any values that can be interpreted as [int] to [int]. $hash = [ordered] @{}
$xmlDoc.Application.Parameters.ChildNodes | ForEach-Object { $hash[$_.Name] = @{ # Convert the text value to an [int], if it can be parsed as such. value = if ($num = $_.Value -as [int]) { $num } else { $_.Value } } } # Wrap the hashtable in a top-level hashtable and convert to JSON. [ordered] @{ '$schema' = 'https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#'
  contentVersion ='1.0.0.0'
  parameters = $hash
} | ConvertTo-Json

O resultado acima produz o seguinte: observe como não42 está citado :

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "Parameter1": {
      "value": "test1"
    },
    "parameter4": {
      "value": 42
    }
  }
}