2016-02-02 33 views
21

Próbuję dostać jq do analizowania struktury JSON jak:Zastosowanie jq do analizowania JSON String

{ 
    "a" : 1, 
    "b" : 2, 
    "c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n" 
} 

Oznacza to, że element w JSON jest ciągiem z zbiegłego JSON.

Tak, mam coś na wzór $ jq [.c] myFile.json | jq [.id]

Ale to wywala z jq: error: Cannot index string with string

To dlatego, że wyjście .c jest ciągiem znaków, nie więcej JSON. Jak uzyskać jq do przeanalizowania tego ciągu?

Moje pierwsze rozwiązanie jest użycie sed zastąpić wszystkie znaki ewakuacyjne (\":\", \",\" i \") ale to niechlujny, zakładam, że istnieje sposób wbudowane jq to zrobić?

Dzięki!

edit: Również wersja jq dostępny jest tutaj:

$ jq --version 
jq version 1.3 

Chyba mogę go aktualizować w razie potrzeby.

+0

To pytanie również pomaga, jeśli szukasz: "Jak uwolnić ciąg json za pomocą jq?" – k0pernikus

Odpowiedz

27

JQ ma fromjson polecenie wbudowane w tym celu:

jq '.c | fromjson | .id' myFile.json 

fromjson się w wersji 1.4.

+2

Dziękuję. To działa. Przyjmuję tę odpowiedź, ponieważ czuję się bardziej "idiomaiczna". Pozdrawiam. –

+2

To powinno być oznaczone poprawną odpowiedzią. –

+0

@ColinGrogan proszę. – vbence

18

Można użyć wyjścia surowego (R), który będzie przywróceniu znaczenia znaków:

jq -r .c myfile.json | jq .id 

Uzupełnienie: Ma to tę zaletę, że działa w JQ 1.3 i up; w rzeczywistości powinien działać w każdej wersji jq, która ma opcję -r.

+0

Doskonale, dzięki! –