¿Cómo convertir la matriz powershell a json usando ConvertTo-Json?

4
mark 2019-10-30 00:11.

Observar:

C:\> [array]@(1,2) | ConvertTo-Json
[
    1,
    2
]
C:\> [array]@(1) | ConvertTo-Json
1
C:\> [array]@() | ConvertTo-Json
C:\>

(Espero [1] y [] de los dos últimos casos respectivamente)

Entonces, si quiero usar el ConvertTo-Jsonmétodo estándar , ¿cómo lo hago de manera confiable, incluso cuando la matriz contiene 1 o 0 elementos?

Tenga en cuenta que el posprocesamiento del resultado no es factible cuando la matriz es parte de un objeto complejo convertido a json.

EDITAR 1

C:\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.17763.592
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17763.592
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1


C:\> [array]@(1) | ConvertTo-Json -AsArray
ConvertTo-Json : A parameter cannot be found that matches parameter name 'AsArray'.
At line:1 char:30
+ [array]@(1) | ConvertTo-Json -AsArray
+                              ~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [ConvertTo-Json], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.ConvertToJsonCommand

C:\>

2 answers

4
mklement0 2019-10-30 08:19.

PowerShell Core (v6 +) ofrece el conveniente -AsArrayconmutador, que se analiza en la sección inferior.


Si $vales una matriz vacía, un escalar o una matriz, envíe , @($val)a ConvertTo-Json través de la canalización para asegurarse de que se serialice como una matriz :

if (-not $IsCoreCLR) { # Workaround for Windows PowerShell # Only needed once per session. Remove-TypeData -ErrorAction Ignore System.Array } # Send an empty array, a single object, and an array... @(), 1, (1, 2) | ForEach-Object { # ... and ensure that each input ($_) serializes as a JSON *array*.
  , @($_) | ConvertTo-Json 
}

Nota:

  • La necesidad de la solución alternativa de Windows PowerShell se explica en esta respuesta .

  • ,, el operador de construcción de matriz , se usa aquí en su forma unaria para proporcionar una matriz de envoltura auxiliar de un solo elemento para enviar la matriz como un todo (como un solo objeto) a través de la tubería; de forma predeterminada, el envío de una matriz (enumerable) a la canalización envía sus elementos uno por uno ; tenga en cuenta que este es el comportamiento fundamental de la canalización, independientemente de los cmdlets involucrados.

  • @(...), el operador "array-garantor" (operador de subexpresión de matriz), asegura que $_es una matriz , es decir, envuelve el operando en una matriz, a menos que ya lo sea (hablando libremente [1] ); esto es necesario para cubrir el caso de $_contener un solo objeto (escalar; 1en este caso).

  • Una advertencia general : ConvertTo-Jsonlimita silenciosamente su profundidad de serialización 2por defecto , lo que resulta en una pérdida silenciosa de datos con una entrada más anidada ; utilice el -Depthparámetro según sea necesario.

    • Esta publicación SO discute el problema.

    • Este problema relacionado con GiHub solicita que se cambie el comportamiento traicionero predeterminado: haga que su voz se escuche allí, si está de acuerdo.

Lo anterior produce lo siguiente: observe cómo se serializó cada entrada como una matriz:

[]
[
  1
]
[
  1,
  2
]

Como alternativa, se pueden pasar las entradas como argumentos para ConvertTo-Jsoncon@($val) :

# Same output as above.
@(), 1, (1,2) | ForEach-Object { ConvertTo-Json @($_) }

Un argumento posicional se une implícitamente al -InputObjectparámetro, que no enumera su argumento y, por lo tanto, vincula las matrices tal como están. Por lo tanto, solo necesita el "garante de matriz" @()en este caso (no también una matriz contenedora con ).


PowerShell Core ahora ofrece un -AsArrayconmutador , que garantiza directamente que la entrada se serializa como una matriz, incluso si solo hay un objeto de entrada único :

PS> 1 | ConvertTo-Json -AsArray
[
  1
]

Sin embargo, dado que las matrices vacías dan como resultado que no se envíen datos a través de la canalización, aún necesita una matriz contenedora si la entrada es la matriz vacía y luego no debe usar-AsArray :

# Note:
#   @() | ConvertTo-Json -AsArray
# would result in NO output.
# Use `, ` to wrap the empty array to ensure it gets sent through
# the pipeline and do NOT use -AsArray
PS> , @() | ConvertTo-Json -Compress

[]

Alternativamente, vuelva a pasar la matriz vacía como argumento :

PS> ConvertTo-Json @() -Compress # Do NOT use -AsArray

[]

El problema es que envuelve -AsArray incondicionalmente su entrada en una matriz JSON , de modo que algo que ya es una matriz se envuelve nuevamente :

PS> ConvertTo-Json -AsArray @() -Compress

[[]]  # *nested* empty arrays

Eso -AsArrayqué no actúan como "garante" de la matriz de forma que @(...)no se discute en este asunto GitHub .


[1] Si el operando es un escalar (objeto único), está envuelto en un elemento único [object[]]; si el operando ya es una matriz o es enumerable, los elementos se enumeran y capturan en una nueva [object[]] matriz.

3
js2010 2019-10-30 10:03.

Finalmente, un uso para -InputObject:

convertto-json -InputObject @(1)
[
  1
]

convertto-json -InputObject @() 
[]

Related questions

MORE COOL STUFF

Cate Blanchett se acostó con su esposo después de 3 días juntos y sigue casada con él 25 años después

Cate Blanchett se acostó con su esposo después de 3 días juntos y sigue casada con él 25 años después

Cate Blanchett desafió los consejos típicos sobre citas cuando conoció a su esposo.

Por qué Michael Sheen es un actor sin fines de lucro

Por qué Michael Sheen es un actor sin fines de lucro

Michael Sheen es un actor sin fines de lucro, pero ¿qué significa eso exactamente?

¡La estrella de Hallmark, Colin Egglesfield, habla sobre emocionantes encuentros con fans en RomaDrama Live! [Exclusivo]

¡La estrella de Hallmark, Colin Egglesfield, habla sobre emocionantes encuentros con fans en RomaDrama Live! [Exclusivo]

¡La estrella de Hallmark, Colin Egglesfield, habló sobre los emocionantes encuentros con los fanáticos en RomaDrama Live! además de su programa INSPIRE en la convención.

Por qué no puedes transmitir 'Northern Exposure' en línea

Por qué no puedes transmitir 'Northern Exposure' en línea

Tendrás que desempolvar un reproductor de Blu-ray o DVD para ver por qué Northern Exposure se convirtió en uno de los programas más populares de los 90.

¿Caduca el repelente de insectos?

¿Caduca el repelente de insectos?

¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?

Dona tu cabello para ayudar a mantener limpia nuestra agua

Dona tu cabello para ayudar a mantener limpia nuestra agua

Los recortes de cabello de los salones y las donaciones personales se pueden reutilizar como tapetes que absorben los derrames de petróleo y ayudan a proteger el medio ambiente.

Una mirada a las bodas más memorables de la Casa Blanca

Una mirada a las bodas más memorables de la Casa Blanca

Solo unas pocas personas se han casado en la Casa Blanca en los últimos más de 200 años. ¿Quiénes eran y qué se requiere para marcar una boda allí?

¿Cuál es la toronja más dulce: blanca, roja o rosada?

¿Cuál es la toronja más dulce: blanca, roja o rosada?

¿Tu boca se emociona al pensar en comer una toronja jugosa? Bueno, frunce el ceño, porque la toronja está repleta de vitaminas y antioxidantes que tu cuerpo necesita.

Hola, NFL, a Joe Burrow y Kyler Murray les vendría bien un poco de ayuda para apoyar los derechos de las mujeres.

Hola, NFL, a Joe Burrow y Kyler Murray les vendría bien un poco de ayuda para apoyar los derechos de las mujeres.

Joe Burrow La respuesta de la NFL a la revocación de Roe v. Wade sin decir una palabra fue un resultado de relaciones públicas enloquecedor pero predecible.

Otro día, otra rueda de prensa LIV desquiciada

Otro día, otra rueda de prensa LIV desquiciada

(De izq.) Pat Perez, Brooks Koepka y Patrick Reed En otra increíble conferencia de prensa para la Liga de Golf LIV de Arabia Saudita, los fanáticos del deporte recibieron una clase magistral asombrosa de Brooks Koepka sobre escupir tonterías y esquivar preguntas. Patrick Reed, Bryson DeChambeau y Pat Perez, algunos de los desertores más recientes del PGA Tour.

Three Arrows Capital recibió la orden de liquidar todos los activos después de incumplir con los préstamos de Bitcoin de USD 675 millones

Three Arrows Capital recibió la orden de liquidar todos los activos después de incumplir con los préstamos de Bitcoin de USD 675 millones

Three Arrows Capital, uno de los barcos que se hunden más grandes de la industria de las criptomonedas, finalmente está saliendo de su miseria. El martes, un tribunal de las Islas Vírgenes ordenó la liquidación del fondo de cobertura de criptomonedas en dificultades en respuesta a las crecientes demandas de los acreedores que exigían el reembolso de los préstamos que hicieron a 3AC.

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

Emma Stone pone a la venta su casa en la playa de Cliffside Malibu por $ 4.2 millones: ¡vea el interior!

Emma Stone pone a la venta su casa en la playa de Cliffside Malibu por $ 4.2 millones: ¡vea el interior!

La casa de mediados de siglo del ganador del Oscar cuenta con tres dormitorios, dos baños y vistas al mar

Jeannie Mai Jenkins dice que "se deprimió mucho, mucho" durante su experiencia de amamantar

Jeannie Mai Jenkins dice que "se deprimió mucho, mucho" durante su experiencia de amamantar

"Te sientes tan derrotada cuando tu bebé tiene hambre que no estás produciendo lo suficiente para el bebé", dijo Jeannie Mai Jenkins sobre amamantar a su hija de 4 meses, Monaco.

La esposa de Bobby Brown, Alicia, no se enfoca en su pasado: "Bobby y Whitney fueron su momento, soy el Yin de su Yang"

La esposa de Bobby Brown, Alicia, no se enfoca en su pasado: "Bobby y Whitney fueron su momento, soy el Yin de su Yang"

La pareja de casi 10 años comparte su historia de amor antes de la nueva serie de realidad de A&E Bobby Brown: Every Little Step, que se estrenará el 31 de mayo.

Calin (Estudo de Caso UX/UI Design)

Calin (Estudo de Caso UX/UI Design)

Este projeto foi desenvolvido a partir de briefing fictício disponibilizado pelo site Tifólio, uma plataforma para designers. Briefing Matriz CSD Como ponto inicial utilizei como base algumas notícias atuais sobre meios de pagamento digital e com essas informações desenvolvi a Matriz CSD.

Times para plataformizar a produtividade das pessoas desenvolvedoras

Times para plataformizar a produtividade das pessoas desenvolvedoras

Plataformas Internas de Desenvolvimento (abreviado para IDP em inglês) provavelmente é a palavra-chave que você mais ouviu recentemente, mas por que isso se tornou uma forte tendência para empresas em momento de hiper-crescimento? Estive no The Developer’s Conference em Florianópolis no começo deste mês (03 de junho), falando um pouco mais sobre as motivações por trás de um IDP e como estamos endereçando esse assunto aqui no PicPay. Rotatividade e Onboarding Quando foi a última vez que alguém entrou no time em que você está atuando?Imagino que o período não passe por mais de 3 meses, sim, estamos em um momento de alta rotação de profissionais de TI, uma pesquisa do Gartner aponta que até o final de 2022, aproximademente 37 milhões de pessoas irão sair voluntariamente da empresa que atuam.

Este texto foi escrito por uma IA

Este texto foi escrito por uma IA

Eu adorei (não) escrever este texto! Você acreditaria se eu te dissesse que isso aqui foi escrito, em sua maioria, por uma Inteligência Artificial? Pois é, acredite ou não, mas é verdade! Não se assuste caso algo aleatório apareça ao decorrer deste texto ou que as informações sejam favoráveis para essa tecnologia… Inclusive, te desafio a encontrar o que foi eu e o que foi a máquina rs A inteligência artificial já é usada para criar textos, músicas e até filmes. Mas como ela consegue fazer isso? A inteligência artificial cria esses textos, músicas e filmes usando algoritmos.

[NÃO PRECISAVA TER DEMORADO TANTO PARA EU APRENDER]

[NÃO PRECISAVA TER DEMORADO TANTO PARA EU APRENDER]

por muitos anos, eu convivi em ambientes e cenários pouco diversos. e isso, infelizmente, me levou a ter posturas e olhares com vieses incoerentes, desrespeitosos e preconceituosos.

Language