Al definir un documento JSON, los campos pueden tener diferentes tipos, como string
, number
, boolean
, etc… Sin embargo, al crear un documento usando --arg
, el valor siempre se trata como string:
--arg name value:
This option passes a value to the jq program as a predefined variable. If you run jq with –arg foo bar, then $foo is available in the program and has the value “bar”. Note that value will be treated as a string, so –arg foo 123 will bind $foo to “123”.
Entonces, ¿cómo generamos un documento JSON con Jq usando --arg
si queremos un valor con tipo numérico?
$ jq --null-input --arg userId 1234 '{ "user_id": $userId }'
{
"user_id": "1234" # String, not a number 😟
}
Una posible solución pasa por usar la función tonumber
de Jq:
$ jq --null-input --arg userId 1234 '{ "user_id": $userId | tonumber }'
{
"user_id": 1234 # 😀
}
Pero… ¿y si queremos convertir a un boolean
? Jq no proporciona un tobool
o similar…
La solución válida para cualquier tipo es usar --argjson
, en vez de --arg
:
$ jq --null-input --argjson good true '{ "good": $good }'
{
"good": true # 👍
}
Esta técnica sirve para cualquier tipo; repitiendo el ejemplo anterior para un number
:
$ jq --null-input --argjson userId 1234 '{ "user_id": $userId }'
{
"user_id": 1234 # 😀
}
Revisando la documentación de --argjson
:
If you run jq with –argjson foo 123, then $foo is available in the program and has the value 123.
#TIL
#Today_I_Learned