Jq zeigt keine Nullausgabe

Ich habe den folgenden Code im Befehlszeilenskript:

output_json=$(jq -n \
                 --argjson ID "${id}" \
                 --arg Title "${title}" \
                 --argjson like "\"${like}\"" \
                '$ARGS.named')

Ich habe die Variablen id, title und like in die jq eingefügt. Ich bekomme folgende Ausgabe:

[
  {
    "ID": 6,
    "Title": "ABC",
    "like": ""
  },
  {
    "ID": 22,
    "Title": "ABC",
    "like": "Yes"
  }
]

Aber ich versuche, die Ausgabe im folgenden Format zu erhalten, dh mit null:

[
  {
    "ID": 6,
    "Title": "ABC",
    "like": null
  },
  {
    "ID": 22,
    "Title": "ABC",
    "like": "Yes"
  }
]

Ich verstehe nicht ganz, ob das generell möglich ist, oder ist es ein Problem mit meinem jq-Befehl?

Und soweit ich verstanden habe ist "like": "" nicht dasselbe wie "like": null. Ich bin jetzt auch ein wenig verwirrt und verstehe nicht wirklich, was die richtige Wahl ist.

🤔 А знаете ли вы, что...
С помощью Bash можно создавать скрипты, выполняющие резервное копирование и синхронизацию данных.


27
1

Antwort:

Gelöst

Wenn Sie --argjson verwenden, müssen Sie ein gültiges JSON-codiertes Argument angeben. Wenn Sie also null erhalten möchten, muss der Wert buchstäblich null sein. Ihre Lösung fügt jedoch Anführungszeichen hinzu, sodass sie niemals zu null ausgewertet werden kann. (Außerdem ist es nur dann eine gültige JSON-Zeichenfolge, wenn sie der JSON-Codierung für Sonderzeichen wie die Anführungszeichen selbst folgt).

Wenn Sie im Normalfall einen JSON-String haben möchten und null im Fall, dass er leer ist, importieren Sie den Inhalt von ${like} als String mit --arg und ohne die zusätzlichen Anführungszeichen (genau wie Sie es mit ${title} tun), dann verwenden Sie einige jq Logik, um die leere Zeichenfolge in null umzuwandeln. Eine if-Anweisung würde zum Beispiel reichen:

like=
jq -n --arg like "${like}" '{like: (if $like == "" then null else $like end)}'
{
  "like": null
}