Znam „jq” do parsowania Jsona.
Pracuję z jedną usługą, która generuje odpowiedź JSON, w której jedną z właściwości jest ciąg JSON. Jak przekonwertować tę cytowaną wartość na prawidłowy ciąg json, aby móc go następnie przetworzyć za pomocą jq?
Na przykład, jeśli po prostu wyświetlę zwykły ładnie wydrukowany plik json z „jq.”, Oto krótki fragment wyniku:
"someJsonString": "{\"date\":\"2018-01-08\", ...
Mogę użyć jq, aby uzyskać wartość tej właściwości, ale muszę przekonwertować cytowany ciąg na prawidłowy plik json, usuwając go.
Przypuszczam, że mógłbym przesłać go do sed, usuwając otwierające i kończące podwójne cudzysłowy oraz usuwając wszystkie ukośniki odwrotne („ sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'
”). To wydaje się działać, ale nie wydaje się to najbardziej niezawodnym rozwiązaniem.
Aktualizacja :
Żeby trochę wyjaśnić, co robię, oto kilka próbek, które pokazują, co próbowałem:
% 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\",...
Aktualizacja :
Oto całkowicie samodzielny przykład:
% 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\"}"
Aktualizacja :
Gdybym próbował przetworzyć to ostatnie wyjście za pomocą prawdziwego wyrażenia jq, robi coś takiego:
% 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)
jq
dostać tylko wartość właściwości String, to powróci to Niecytowany? Jeśli tak, po prostu włóż to do świeżegojq
.echo $(jq statement here)
?Odpowiedzi:
Jest na to
raw
flagaWydajność
źródło
jq
celu dalszego przetwarzania JSON, natomiast dzięki podejściu Romana możesz kontynuować to samojq
wyrażenie.jq -rc '.stuff.date'
produkujejq: error (at <stdin>:0): Cannot index string with string "date"
. Jednak:.stuff | fromjson | .date
działa dobrze.Z
jq
„sfromjson
funkcji:Przykładowa
stuff.json
zawartość:Wyjście:
źródło