У меня есть файл JSON, members.json
как показано ниже.
{
"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"
}
}
]
}
}
Я хочу разобрать его с помощью bash
скрипта, получить только список полей memberId
.
Ожидаемый результат:
memberIds
-----------
0x7b93910446f91928e23e1043dfdf5bcf
0x7b93910446f91928e23e1043dfdf5bcG
Я попытался добавить следующий код bash + python .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'"]';
}
А потом позвонил:
$ cat members.json | getJsonVal "memberId"
Но это бросает:
Traceback (most recent call last):
File "<string>", line 1, in <module>
KeyError: 'memberId'
python
, а не тоbash
, что вы используете для анализа json. Например, эта ошибка, безусловно, является ошибкой Python, а не ошибкой bash.python
, не означает , что его цель заключается в использованииpython
Ответы:
Если бы вы использовали:
Вы можете проверить структуру вложенного диктонара
obj
и увидеть, что ваша оригинальная строка должна выглядеть так:к этому элементу "memberId". Таким образом, вы можете сохранить Python как единственного пользователя.
Если во вложенном элементе «hit» есть несколько элементов, вы можете сделать что-то вроде:
Решение Криса Дауна лучше для поиска единственного значения (уникальных) ключей на любом уровне.
С моим вторым примером, который печатает несколько значений, вы выходите за пределы того, что вы должны попробовать с одним вкладышем, в этот момент я вижу мало причин, почему нужно выполнять половину обработки в bash, и вы бы перешли к полному решению Python ,
источник
Другой способ сделать это в bash - использовать jshon . Вот решение вашей проблемы с помощью
jshon
:В
-e
опции извлечения значений из JSON.-a
Перебирает массив и-u
декодирует конечную строку.источник
Что ж, ваш ключ совершенно явно не в корне объекта. Попробуйте что-то вроде этого:
Преимущество этого состоит не просто в том, чтобы вводить синтаксис в Python, что может привести к поломке (или, что еще хуже, к выполнению произвольного кода).
Затем вы можете назвать это так:
источник
Другой альтернативой является JQ :
источник
Попробуй это:
Если у вас уже есть
pretty printed
JSON, почему бы вам не простоgrep
?Вы всегда можете получить симпатичный печатный формат с python simplejson
grep
.Используйте дампы:
После этого просто
grep
результат с шаблоном 'memberId'.Чтобы быть полностью точным:
Использование:
источник
Следуя этой теме, я бы использовал json.tool в python:
python -m json.tool members.json | awk -F'"' '/memberId/{print $4}'
источник
При использовании deepdiff вам не нужно знать точные ключи:
источник
Вот решение Bash.
find_members.sh
добавить следующую строку в файл + сохранить
chmod +x find_members.sh
Теперь запустите это:
источник