Jak przekonwertować osadzony (cytowany) ciąg json na json


22

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)

Jeśli używasz jqdostać tylko wartość właściwości String, to powróci to Niecytowany? Jeśli tak, po prostu włóż to do świeżego jq.
DopeGhoti

Nie, nie zwraca go bez zmian. O to chodzi.
David M. Karr

Jak o echo $(jq statement here)?
DopeGhoti

Nie, bez zmian.
David M. Karr

@ DavidM.Karr, ok, jeśli to możliwe - poszerz swój wkład o rzeczywisty kluczowy ciąg i końcowy wynik
RomanPerekhrest

Odpowiedzi:


20

Jest na to rawflaga

    -r      output raw strings, not JSON texts;

jq -rc .stuff stuff.json

Wydajność

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

Różnica polega na tym, że z odpowiedzią Romana masz gwarancję otrzymania prawidłowego wyjścia JSON lub komunikatów o błędach, jeśli nie jest to prawidłowy JSON.
Kusalananda

Ważny punkt, ale jeśli jest to używane w automatyzacji, myślę, że byłoby niezwykłe, gdyby nagle nie miał prawidłowego wyjścia JSON. Najwygodniejsza forma będzie przez cały czas idealna. Jednak nadal warto wiedzieć o bardziej precyzyjnych metodach.
David M. Karr

@ DavidM.Karr „niezwykłe, że nagle nie ma prawidłowego wyjścia JSON” HA! Riiiight. Obsługa błędów w automatyzacji? Błędy nigdy się nie zdarzają! Po co się męczyć!
Bruno Bronosky

Wymaga to połączenia z innym w jqcelu dalszego przetwarzania JSON, natomiast dzięki podejściu Romana możesz kontynuować to samo jqwyrażenie.
Raman

1
@ cricket_007: wypróbowałem to z JQ 1.5 i potwierdziłem, że nie działa: jq -rc '.stuff.date'produkuje jq: error (at <stdin>:0): Cannot index string with string "date". Jednak: .stuff | fromjson | .datedziała dobrze.
Raman

26

Z jq„s fromjsonfunkcji:

Przykładowa stuff.jsonzawartość:

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

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

Wyjście:

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

To wydaje się niepotrzebne.
Podano
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.