Próbuję jq
przeanalizować strukturę JSON, taką jak:
{
"a" : 1,
"b" : 2,
"c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}
Oznacza to, że element w formacie JSON jest ciągiem znaków ze zmienionym kodem JSON.
Więc mam coś w stylu
$ jq [.c] myFile.json | jq [.id]
Ale to się psuje jq: error: Cannot index string with string
Dzieje się tak, ponieważ wyjściem .c jest ciąg znaków, a nie więcej JSON. Jak sprawić, by jq przeanalizował ten ciąg?
Moje pierwsze rozwiązanie jest użycie sed zastąpić wszystkie znaki ewakuacyjne ( \":\"
, \",\"
i \"
), ale to jest brudny, zakładam istnieje sposób wbudowane jq
to zrobić?
Dzięki!
edycja: Również dostępna tutaj wersja jq to:
$ jq --version
jq version 1.3
Myślę, że w razie potrzeby mógłbym to zaktualizować.
Odpowiedzi:
jq ma
fromjson
wbudowaną obsługę :jq '.c | fromjson | .id' myFile.json
fromjson
został dodany w wersji 1.4.źródło
fromjson
funkcja nie jest dostępna. Innymi słowy, nawet jeśli ta odpowiedź jest interesująca, nie odpowiada na pytanie.jq 'fromjson | .' myfile
"{\"key\":1, \"word\":\"cat\"}"
Możesz użyć nieprzetworzonego wyjścia (-r), które spowoduje cofnięcie znaków:
jq -r .c myfile.json | jq .id
DODATEK: Ma tę zaletę, że działa w jq 1.3 i nowszych; w rzeczywistości powinno działać w każdej wersji jq, która ma opcję -r.
źródło