Я пытаюсь отфильтровать следующий пример файла .json, где ["cbaCode"]['HHH'] отличается от "300":
{
"took" : 32,
"timed_out" : false,
"_shards" : {
"total" : 12,
"successful" : 12,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1549,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "ib-prodfulltext-t24-transhist-202211",
"_type" : "_doc",
"_id" : "D7JGOQTS2XPVSG6HN",
"_score" : null,
"_source" : {
"accountNbr" : 6900069,
"accountNbrText" : "6900069",
"acctApplNbr" : "02",
"acknowledgementDate" : "2022-11-01T01:46:38.000+01:00",
"acknowledgementDateText" : "2022-11-01",
"avoType" : "ADI",
"bankCode" : "0100",
"bankingCore" : "T24",
"bazenType" : "ADI",
"businessDate" : "2022-11-01",
"cbaCode" : "10000101002",
"cbaCodeParts" : {
"BBB" : "002",
"HHH" : "100",
"TT" : "01",
"VVV" : "001"
},
"chargeType" : "SHAR",
"creditDebitIndicator" : "D",
"currencyCode" : "CZK",
...
Я пытался:
import json
with open('2022-10.json', 'r') as f:
input_dict = json.load(f)
output_dict = [x for x in input_dict if not x['HHH'] == "300"]
output_json = json.dumps(output_dict)
print(output_json)
... что вызывает:
TypeError: строковые индексы должны быть целыми числами
Я думаю, что мне не хватает запроса файла json на 5-м уровне, но он как бы теряется в структуре.
Помощь приветствуется.
Содержит ли ваш файл один JSON (как в вашем примере) или массив JSON, как мы можем предположить, когда ваш код повторяется input_dict
?
@0x0fba Да, "cbaCodeParts", там опечатка Да, он содержит один файл с несколькими сообщениями.
Вы должны указать точный путь внутри вашего дерева Json:
import json
with open('2022-10.json', 'r') as f:
input_dict = json.load(f)
output_dict = [x for x in input_dict["hits"]["hits"]
if not x["_source"]["cbaCodeParts"]["HHH"] == "300"
]
output_json = json.dumps(output_dict)
print(output_json)
Доступ только к данным верхнего уровня, который является словарем, даст вам только список этого словаря, а не массив, который вам может понадобиться. Приведенный выше код предполагает, что вы хотите просмотреть массив, предоставленный вторым hits
-полем.
Кроме того, предоставление дополнительных файлов Json может помочь людям лучше понять вашу проблему.
Я получаю KeyError: 'cbaCodeParts'. Когда я пытаюсь использовать data = input_dict['hits']['hits'] and data['_source'], я получаю TypeError: индексы списка должны быть целыми числами или фрагментами, а не str.
input_dict['hits']['hits']
— это массив, а это значит, что вы должны обращаться к нему с помощью таких чисел, как input_dict ['hits'] ['hits'] [12345]
или, когда вы присваиваете его переменной: data[123]
. Затем вы можете вытащить _source
вот так: data[n]['_source']
где n
— число. Короче говоря: input_dict['hits']['hits']
содержит несколько экземпляров _source
, и вам нужно указать, какой из них вы хотите.
Вы имеете в виду ["cbaCodeParts"]['HHH'] ?