Как отфильтровать json и распечатать в новый файл json?

#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)
  

случается с лучшими из нас :).