Přeskočit tisk pole, pokud je prázdné ve výsledném JSON

0

Otázka

Mám json:

    "spec": {
        "background": true,
        "failurePolicy": "Fail",
        "rules": [
            {
                "exclude": {
                    "resources": {}
                },
                "generate": {
                    "clone": {}
                },
                "match": {
                    "resources": {
                        "kinds": [
                            "networking.k8s.io/v1/NetworkPolicy"
                        ]
                    }
                },
                "mutate": {},
                "name": "validate-nodeport",
                "validate": {
                    "message": "Services of type NodePort are not allowed.",
                    "pattern": {
                        "spec": {
                            "type": "!NodePort"
                        }
                    }
                }
            }
        ],
        "validationFailureAction": "audit"
    },
    "status": {
        "ready": true
    }
}

Mám jq příkaz:

(.spec.rules[0].match.resources.kinds[] / "/")
| [select(.[1])[0] // null, select(.[2])[1] // null, last]
  as [$version,$group,$kind]
| {$version,$group,$kind}

Ale někdy pole "verze" nebo "skupina" možná prázdný. Musím psát následující podmínku - pokud řetězec je null, pak to není nutné psát.

jq
2021-11-22 08:03:41
3

Nejlepší odpověď

2

Filtr máš je už docela efektivní způsob, jak se vypořádat s tvorbou objektů, kdy jednotlivé oblasti (verze, skupina a druh) jsou přítomny a není požadováno, aby re-psát celou věc řešit jeden konkrétní případ.

Přeskočit pole null, jen potrubí předchozí filtr níže

with_entries(select(.value!=null))

tedy celý filtr je níže. Viz jqplay demo

(.spec.rules[0].match.resources.kinds[] / "/")
| [select(.[1])[0] // null, select(.[2])[1] // null, last]
  as [$version,$group,$kind]
| {$version,$group,$kind} 
| with_entries(select(.value!=null))
2021-11-22 08:17:44
0

Použití select filtr:

jq '(.spec.rules[0].match.resources.kinds[] / "/")
        | [select(.[1])[0] // null, select(.[2])[1] // null, last]
            as [$version,$group,$kind]
    | {$version,$group,$kind}
    | select(.version != "")
    | select(.group != "")
    ' \
    spec.json

Nebo pokud chcete pouze snížit výstup:

jq '(.spec.rules[0].match.resources.kinds[] / "/")
        | [select(.[1])[0] // null, select(.[2])[1] // null, last]
            as [$version,$group,$kind]
    | {$version,$group,$kind}
    | if .version != "" then
        if .group != "" then
            {$version,$group,$kind}
        else
            {$version,$kind}
        end
      else
        if .group != "" then
            {$group,$kind}
        else
            {$kind}
        end
      end
    ' \
    spec.json
2021-11-22 08:41:21
0

Na {$version,$group,$kind} část z mých ostatních odpovědí byla součástí ukázat, jak využít proměnné, které jste požadovali, které mají být vytvořeny. Tedy, pokud nechcete, aby to bylo napsáno, a ne vytvářet to v první řadě pouze upravit ji později s with_entries(select(.value)) nebo podobně. Místo toho, vytvořit jinak, podle vašich potřeb.

Například, místo toho, aby bezpodmínečně používat všechny tři části stejně jako v {$version,$group,$kind} můžete vybrat jen ty, které nejsou null pomocí [{$version},{$group},{$kind} | select(.[])] | add: (Demo)

(.spec.rules[0].match.resources.kinds / "/")
| [select(.[1])[0] // null, select(.[2])[1] // null, last]
  as [$version,$group,$kind]
| [{$version},{$group},{$kind} | select(.[])] | add

Ještě lepší je, upravit [...] as {...} část přímo vytvářet, co budete potřebovat, například: (Demo)

(.spec.rules[0].match.resources.kinds[] / "/")
| ({version:select(.[1])[0]} // {})
  + ({group:select(.[2])[1]} // {})
  + {kind: last}
2021-11-22 09:03:47

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ý
..................................................................................................................