it-swarm.com.de

So konvertieren Sie eingebettete (in Anführungszeichen stehende) JSON-Zeichenfolgen in JSON

Ich kenne "jq" zum Parsen von json.

Ich arbeite mit einem Dienst, der eine JSON-Antwort erzeugt, wobei eine der Eigenschaften selbst eine JSON-Zeichenfolge ist. Wie konvertiere ich diesen Wert in einen gültigen JSON-String, damit ich ihn dann mit JQ verarbeiten kann?

Wenn ich zum Beispiel nur den einfachen, hübsch gedruckten json aus "jq." Betrachtet, ist hier ein kurzer Auszug der Ausgabe:

"someJsonString": "{\"date\":\"2018-01-08\", ...

Ich kann jq verwenden, um den Wert dieser Eigenschaft abzurufen, aber ich muss die angegebene Zeichenfolge in einen gültigen json konvertieren, indem ich sie "entkopple".

Ich nehme an, ich könnte es in sed leiten, die öffnenden und endenden doppelten Anführungszeichen entfernen und alle umgekehrten Schrägstriche entfernen ("sed -e 's/^"//' -e 's/"$//' -e 's/\\//g' "). Das scheint zu funktionieren, aber das scheint nicht die robusteste Lösung zu sein.

pdate:

Um ein wenig klarer zu machen, was ich tue, hier ein paar Beispiele, die zeigen, was ich versucht habe:

% curl -s -q -L 'http://.../1524.json' | jq '.results[0].someJsonString' | jq .
"{\"date\":\"2018-01-08\",...
% echo $(curl -s -q -L 'http:/.../1524.json' | jq '.results[0].someJsonString') | jq .
"{\"date\":\"2018-01-08\",...

pdate:

Hier ist ein völlig eigenständiges Beispiel:

% cat stuff.json | jq .
{
  "stuff": "{\"date\":\"2018-01-08\"}"
}
% cat stuff.json | jq '.stuff'
"{\"date\":\"2018-01-08\"}"
% cat stuff.json | jq '.stuff' | jq .
"{\"date\":\"2018-01-08\"}"

pdate:

Wenn ich versucht habe, diese letzte Ausgabe mit einem echten jq-Ausdruck zu verarbeiten, geschieht Folgendes:

% cat stuff.json | jq '.stuff' | jq '.date'
assertion "cb == jq_util_input_next_input_cb" failed: file "/usr/src/ports/jq/jq-1.5-3.x86_64/src/jq-1.5/util.c", line 371, function: jq_util_input_get_position
Aborted (core dumped)
33
David M. Karr

Hierfür gibt es ein raw -Flag

    -r      output raw strings, not JSON texts;
jq -rc .stuff stuff.json

Ausgabe

{"date":"2018-01-08"}
26
cricket_007

Mit jq 's fromjson Funktion:

Stichprobe stuff.json Inhalt:

{
  "stuff": "{\"date\":\"2018-01-08\"}"
}

jq -c '.stuff | fromjson' stuff.json

Die Ausgabe:

{"date":"2018-01-08"}
33
RomanPerekhrest