Jq: Mostrar nome e tipo de propriedade

Criado em 2 mai. 2014  ·  4Comentários  ·  Fonte: stedolan/jq

Oi,

Estou tentando listar todas as propriedades e seus tipos para um objeto. O mais próximo que consegui chegar até agora é algo assim:

cat file.json | jq '.property | keys, map(type)'

Acabo com duas matrizes; o primeiro listando os nomes das propriedades, o segundo listando os tipos. Existe uma maneira de intercalar cada chave e seu tipo? No final das contas, eu gostaria de terminar com um novo objeto contendo as chaves do objeto original e com seus tipos como seus valores. Então, se começou com algo assim:

{
  "myStringProperty": "this is a string",
  "myArrayProperty": [ 1, 2, 3 ]
}

Eu acabaria com algo assim:

{
  "myStringProperty": "string",
  "myArrayProperty": "array",
 ...
}

Observe que não preciso recursar em outros objetos (ainda não :))

support

Comentários muito úteis

Ok, então do topo da minha cabeça, há to_entries , que transforma {"foo": "bar"} em [{"key": "foo", "value": "bar"}] , e há from_entries , que inverte esta operação. with_entries(f) é, se bem me lembro, o mesmo que to_entries | map(f) | from_entries .

Então, estou atribuindo o .value de cada um desses objetos (que são representações de pares de valores-chave de objetos) a si mesmo canalizados por meio da função type . Na verdade, ao explicar isso, percebi que há uma maneira muito mais limpa de fazer isso: o manual jq fala sobre o operador de atribuição de tubos, que faz exatamente o que precisamos. Podemos substituir o código acima pelo seguinte usando o referido operador:

jq 'with_entries(.value |= type)'

Você pode ler mais sobre o assunto nas páginas do manual jq sobre atribuição e with_entries .

Todos 4 comentários

jq 'with_entries(.value = (.value | type))' deve fazer o trabalho.

Funciona bem. Obrigado! Agora eu tenho que estudar isso para entender como isso funciona :)

Ok, então do topo da minha cabeça, há to_entries , que transforma {"foo": "bar"} em [{"key": "foo", "value": "bar"}] , e há from_entries , que inverte esta operação. with_entries(f) é, se bem me lembro, o mesmo que to_entries | map(f) | from_entries .

Então, estou atribuindo o .value de cada um desses objetos (que são representações de pares de valores-chave de objetos) a si mesmo canalizados por meio da função type . Na verdade, ao explicar isso, percebi que há uma maneira muito mais limpa de fazer isso: o manual jq fala sobre o operador de atribuição de tubos, que faz exatamente o que precisamos. Podemos substituir o código acima pelo seguinte usando o referido operador:

jq 'with_entries(.value |= type)'

Você pode ler mais sobre o assunto nas páginas do manual jq sobre atribuição e with_entries .

Obrigada pelo esclarecimento. A versão | = também funciona.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

kelchy picture kelchy  ·  4Comentários

geoffeg picture geoffeg  ·  3Comentários

benjamin-bin-shen picture benjamin-bin-shen  ·  3Comentários

lbrader picture lbrader  ·  3Comentários

lhunath picture lhunath  ·  3Comentários