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 :))
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.
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 queto_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çãotype
. 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 .