Převod objektu na pole nebo udržet pole s jq

0

Otázka

Mám vstupní soubor, který typ se může lišit od pole objekt, jeden z následujících vstupů očekává, že:

[{"version": "1.0"}]
{version: "1.0"}

Jak mohu postavit jq výraz pro výstupní vždy být přeměněn na pole. Já jsem přišel s následující:

jq 'if (select(has("version")?)) then [.] else . end'

jednou version klíčové je, uzavřeno, objekt je přidán do pole, ale pokud ne, uzavřeno, to by znamenalo, že už je to pole, nic tisknout, a já bych to, že to bude tisknout, jak to je. Prosím, navrhnout správný způsob, jak ho dosáhnout.

bash jq json
2021-11-21 19:11:10
3

Nejlepší odpověď

4

Můžete zkontrolovat vstup je type přímo:

jq 'if type == "object" then [.] else . end'

Demo


Nebo použijte dekonstrukce alternativní operátor ?// (k dispozici od jq 1.6):

jq '. as [$v] ?// $v | [$v]' 

Demo

2021-11-21 19:13:36
1

Pomocné pmf je odpověď, proč není v této práci?

input.jsonl:

[{"version": "1.0"}]
{"version": "2.0"}

Příkaz:

jq -c 'if (select(has("version")?)) then [.] else . end'

Aktuální výstup:

[{"version": "2.0"}]

Požadovaný výstup:

[{"version": "1.0"}]
[{"version": "2.0"}]

Za prvé, select filtry hodnot. Pro každou hodnotu vstupu select, vyhodnocuje filtru si pak dát je na jeho vstup, a pokud ten filtr vyhodnocuje na hodnotu true, celý vstupní hodnoty vyzařovaného beze změny. Jinak není žádný výstup. Pomocí select tady je neužitečné, protože chcete, hodnotu true nebo false pro if stavu. Pokud podmínka součástí vašeho if-then-else vyjádření vydává žádný výstup pak celý if-then-else vyjádření vydává žádný výstup.

Důkladnější způsob, jak pochopit select(expr) je to pokaždé, když expr vyzařuje skutečnou hodnotu pak select(expr) vyzařuje jeho vstupní hodnoty. Důkladnější způsob, jak pochopit if cond then a else b end je to pokaždé, když cond vyzařuje skutečnou hodnotu celé if-then-else vydává a a pokaždé, když se cond vyzařuje hodnotu false celý if-then-else vydává b.

Dobře, takže zapomeňte na select... proč není v této práci?

Příkaz:

jq -c 'if (has("version")?) then [.] else . end'

Aktuální výstup:

[{"version": "2.0"}]

V tomto případě, ? je chyba potlačení operátora, a je ekvivalentní try has("version") což je samo o sobě rovnocenné try has("version") catch empty. To znamená, že když dojde k chybě výrazu vrátí empty což znamená žádný výstup. Chyba se skutečně nastat, když je na vstupu seznam místo objektu. Když stav část if-then-else vyjádření vydává žádný výstup, uhodli jste, celý výraz vyzařuje žádný výstup.

Mohli byste udělat tuto práci tím, že dělá toto místo:

Příkaz:

jq -c 'if (try has("version") catch false) then [.] else . end'

Aktuální výstup:

[{"version":"1.0"}]
[{"version":"2.0"}]

Samozřejmě, že je to trochu kolotoč. Ty by se měly řídit pmf odpověď. Ale to možná pomůže pochopit, proč váš pokus nevyšlo tak, jak jste očekávali.

Jako pravidlo, snažte se ujistěte se, že vaše select a if podmínky vždy vyzařují přesně jeden výstup pro každý vstup - tímto způsobem, nebudete překvapeni. Výrazy, které mohou emitovat žádné výstupy (např. expr? nebo select(...)), nebo více výstupy (např. .[]), bude pro matoucí čas, kdy se používá jako podmínky v select nebo if.

2021-11-21 21:08:09
0

Na arrays funkce vybere vstup, pokud to je pole. V kombinaci s // můžete zvládnout případ, kdy tomu tak není:

$ jq -c 'arrays // [.]' versions.json 
[{"version":"1.0"}]
[{"version":"2.0"}]

Kde versions.json je:

[{"version":"1.0"}]
{"version":"2.0"}
2021-11-22 09:38:14

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................