Concat 2-Felder in JSON mit jq

72

Ich benutze, jqum meine neu zu formatieren JSON.

JSON-Zeichenfolge:

{"channel": "youtube", "profile_type": "video", "member_key": "hello"}

Gewünschte Ausgabe:

{"channel" : "profile_type.youtube"}

Mein Befehl:

echo '{"channel": "youtube", "profile_type": "video", "member_key": "hello"}' | jq -c '. | {channel: .profile_type + "." + .member_key}'

Ich weiß, dass der folgende Befehl die Zeichenfolge verkettet. Aber es funktioniert nicht in der gleichen Logik wie oben:

echo '{"channel": "youtube", "profile_type": "video", "member_key": "hello"}' | jq -c '.profile_type + "." + .member_key'

Wie kann ich mein Ergebnis mit NUR jq erzielen?

darthsidious
quelle
Ich denke, ich versuche genau das gleiche mit meinem YouTube-API-Skript zu tun;)
Sridhar Sarnobat

Antworten:

98

Verwenden Sie Klammern um den String-Verkettungscode:

echo '{"channel": "youtube", "profile_type": "video", "member_key": "hello"}' \
 | jq '{channel: (.profile_type + "." + .channel)}'
Anthony Battaglia
quelle
1
Verwenden Sie stattdessen eine Zeichenfolgeninterpolation, die viel sauberer ist als die Verkettung mehrerer Zeichenfolgen.
Jeff Mercado
41

Hier ist eine Lösung, die die von Jeff vorgeschlagene Zeichenfolgeninterpolation verwendet :

{channel: "\(.profile_type).\(.member_key)"}

z.B

$ jq '{channel: "\(.profile_type).\(.member_key)"}' <<EOF
> {"channel": "youtube", "profile_type": "video", "member_key": "hello"}
> EOF
{
  "channel": "video.hello"
}

Die String-Interpolation funktioniert mit der \(foo)Syntax (ähnlich einem Shell- $(foo)Aufruf).
Siehe das offizielle JQ-Handbuch .

jq170727
quelle