Como converter valor xml inteiro em JSON sem aspas
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
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
}
}
}