Mam plik JSON, members.json
jak poniżej.
{
"took": 670,
"timed_out": false,
"_shards": {
"total": 8,
"successful": 8,
"failed": 0
},
"hits": {
"total": 74,
"max_score": 1,
"hits": [
{
"_index": "2000_270_0",
"_type": "Medical",
"_id": "02:17447847049147026174478:174159",
"_score": 1,
"_source": {
"memberId": "0x7b93910446f91928e23e1043dfdf5bcf",
"memberFirstName": "Uri",
"memberMiddleName": "Prayag",
"memberLastName": "Dubofsky"
}
},
{
"_index": "2000_270_0",
"_type": "Medical",
"_id": "02:17447847049147026174478:174159",
"_score": 1,
"_source": {
"memberId": "0x7b93910446f91928e23e1043dfdf5bcG",
"memberFirstName": "Uri",
"memberMiddleName": "Prayag",
"memberLastName": "Dubofsky"
}
}
]
}
}
Chcę to przeanalizować za pomocą bash
skryptu, aby uzyskać tylko listę pól memberId
.
Oczekiwany wynik to:
memberIds
-----------
0x7b93910446f91928e23e1043dfdf5bcf
0x7b93910446f91928e23e1043dfdf5bcG
Próbowałem dodać następujący kod bash + python do .bashrc
:
function getJsonVal() {
if [ \( $# -ne 1 \) -o \( -t 0 \) ]; then
echo "Usage: getJsonVal 'key' < /tmp/file";
echo " -- or -- ";
echo " cat /tmp/input | getJsonVal 'key'";
return;
fi;
cat | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["'$1'"]';
}
A potem nazwany:
$ cat members.json | getJsonVal "memberId"
Ale rzuca:
Traceback (most recent call last):
File "<string>", line 1, in <module>
KeyError: 'memberId'
python
, niebash
, to jest to, czego używasz do parsowania Jsona. Np. Błąd ten z pewnością jest błędem w Pythonie, a nie błędem bash.python
, nie znaczy, że jego celem jest użyciepython
Odpowiedzi:
Jeśli chcesz użyć:
możesz sprawdzić strukturę zagnieżdżonego słownika
obj
i zobaczyć, czy w oryginalnej linii powinno znajdować się:do tego elementu „memberId”. W ten sposób możesz zachować Python jako oneliner.
Jeśli w zagnieżdżonym elemencie „trafienia” znajduje się wiele elementów, możesz zrobić coś takiego:
Rozwiązanie Chrisa Down jest lepsze do znajdowania pojedynczej wartości (unikatowych) kluczy na dowolnym poziomie.
W moim drugim przykładzie, który wypisuje wiele wartości, osiągasz granice tego, co powinieneś wypróbować za pomocą jednej linijki, w tym momencie nie widzę powodu, aby robić połowę przetwarzania w bash, i chciałbym przejść do kompletnego rozwiązania Python .
źródło
Innym sposobem na zrobienie tego w bash jest użycie jshon . Oto rozwiązanie Twojego problemu za pomocą
jshon
:Te
-e
opcje wyodrębnić wartości z JSON.-a
Iteracje nad tablicy i-u
dekoduje końcowy ciąg.źródło
Cóż, twój klucz nie jest najwyraźniej u podstawy obiektu. Wypróbuj coś takiego:
Ma to tę zaletę, że nie tylko po prostu wstrzykuje składnię do Pythona, co może spowodować uszkodzenie (lub, co gorsza, wykonanie dowolnego kodu).
Możesz to tak nazwać:
źródło
Inną alternatywą jest jq :
źródło
Spróbuj tego:
Jeśli masz już
pretty printed
JSON, dlaczego tego nie zrobiszgrep
?Zawsze możesz uzyskać ładny wydrukowany format z pythonem simplejson
grep
.Użyj zrzutów:
Następnie po prostu
grep
uzyskaj wynik za pomocą wzoru „memberId”.Aby być całkowicie precyzyjnym:
Stosowanie:
źródło
Po tym wątku użyłbym json.tool w python:
python -m json.tool members.json | awk -F'"' '/memberId/{print $4}'
źródło
Korzystając z deepdiff , nie musisz znać dokładnych kluczy:
źródło
Oto rozwiązanie bash.
find_members.sh
dodaj następujący wiersz do pliku + zapisz
chmod +x find_members.sh
Teraz uruchom to:
źródło