#python #json
#python #json
Вопрос:
У меня есть приведенный ниже частично неполный код python, который я пытаюсь использовать, чтобы просто проанализировать этот объект JSON и записать результаты в новый файл json или даже вывести результаты на консоль.
Я просто хочу вернуть только те узлы, которые содержат price_cat
of 'C'
, и я также хотел бы просто удалить весь 'History'
узел из каждого объекта полностью, если это возможно.
Что я делаю не так и как я могу просто добиться этого?
import json input_json = "" "
[
{
" type ": " 1 ",
" name ": " name 1 ",
"history":[
{
"expiration_date":"9999-12-31",
"effective_date":"2017-01-01"
}
],
"prices":[
{
"price":"3.00",
"price_cat":"C",
}
]
},
{
" type ": " 2 ",
" name ": " name 2 ",
"history":[
{
"expiration_date":"9999-12-31",
"effective_date":"2017-01-01"
}
],
"prices":[
{
"price":"3.00",
"price_cat":"A",
},
{
"price":"3.00",
"price_cat":"C",
}
]
},
{
" type ": " 1 ",
" name ": " name 3 ",
"history":[
{
"expiration_date":"9999-12-31",
"effective_date":"2017-01-01"
}
],
"prices":[
{
"price":"3.00",
"price_cat":"B",
}
]
}
]" ""
#Transform json input to python objects
input_dict = json.loads (input_json)
#Filter python objects with list comprehensions
output_dict =[x for x in input_dict if x['price_cat'] == 'C']
#Transform python object back into json
output_json = json.dumps (output_dict)
#Show json
print (output_json)
Ответ №1:
Вы не смотрите в прайс-листе в своем словаре:
import json
input_json = """
[
{
" type ":" 1 ",
" name ":" name 1 ",
"history":[
{
"expiration_date":"9999-12-31",
"effective_date":"2017-01-01"
}
],
"prices":[
{
"price":"3.00",
"price_cat":"C"
}]
},
{
" type ":" 2 ",
" name ":" name 2 ",
"history":[
{
"expiration_date":"9999-12-31",
"effective_date":"2017-01-01"
}],
"prices":[
{
"price":"3.00",
"price_cat":"A"
},
{
"price":"3.00",
"price_cat":"C"
}
]
},
{
" type ":" 1 ",
" name ":" name 3 ",
"history":[
{
"expiration_date":"9999-12-31",
"effective_date":"2017-01-01"
}
],
"prices":[
{
"price":"3.00",
"price_cat":"B"
}
]
}
]"""
#Transform json input to python objects
input_dict = json.loads(input_json)
#Filter python objects with list comprehensions
output_dict = []
for input_subdict in input_dict:
matching_prices = []
for price in input_subdict['prices']:
if price['price_cat'] == 'C':
matching_prices.append(price)
if len(matching_prices) > 0:
input_subdict['prices'] = matching_prices
output_dict.append(input_subdict)
#Transform python object back into json
output_json = json.dumps(output_dict)
#Show json
print (output_json)
Это приводит к ответу, который вы ищете:
[
{" type ": " 1 ", " name ": " name 1 ", "history": [{"expiration_date": "9999-12-31", "effective_date": "2017-01-01"}], "prices": [{"price": "3.00", "price_cat": "C"}]},
{" type ": " 2 ", " name ": " name 2 ", "history": [{"expiration_date": "9999-12-31", "effective_date": "2017-01-01"}], "prices": [{"price": "3.00", "price_cat": "C"}]}
]
Комментарии:
1. Хорошо, это имеет смысл, но в строке
for price in input_subdict['prices']:
я получаю сообщение об ошибке, что строковые индексы должны быть целыми числами?2. Я добавил входной json к своему ответу, для которого я получаю ответ в списке. Я предполагаю, что у вас проблема с вашим json, я пропустил его через форматировщик перед его использованием.
3. Извините, я только что кое-что понял: на самом деле это возвращает узлы, которые содержат Price_cat ‘C’, но что мне действительно нужно, так это проверить, содержит ли список цен price_cat ‘C’, и если это так, верните все цены. Итак, если у него есть price_cat A и C, мне все еще нужны обе цены. Но если нет price_cat для ‘c’, я хочу полностью игнорировать узел, как сейчас. Имеет ли это смысл?
Ответ №2:
кажется, вы забыли проиндексировать на один уровень ниже, прежде чем пытаться найти ценовую категорию. Может быть полезно написать это таким образом.
parseObjects = []
for jObject in input_json:
for price in jObject["prices"]:
if price["price_cat"] == "C":
if "history" in jObject:
del jObject["history"]
parseObjects.append(jObject)
случается с лучшими из нас :).