2016-10-11 8 views
0

У меня есть вход JSON, который выглядит следующим образом:Python: Свести и Разбираем некоторые разделы JSON

> {"payment": {"payment_id": "AA340", "payment_amt": "20", "chk_nr": "321749", "clm_list": {"dtl": [{"clm_id": "1A2345", "name": "John", adj:{"adj_id":"W123","adj_cd":"45"}}, {"clm_id": "9999", "name": "Dilton", adj:{"adj_id":"X123","adj_cd":"5"}}]}}} 

Мне нужен выход, чтобы выглядеть следующим образом:

{"clm_id": "1A2345",adj:{"adj_id":"W123"},"payment_amt": "20", "chk_nr": "321749"} 
{"clm_id": "9999"adj:{"adj_id":"X123"},"payment_amt": "20", "chk_nr": "321749"} 

Так код принимает один JSON-doc, анализирует раздел массива претензий и нормализует его, добавляя информацию об оплате в каждый раздел. Даже вложенный JSON анализируется.

Я могу разобрать данные, но не знаю, как нормализовать только определенный раздел данных.

Код ниже будет анализировать данные, но НЕ нормализуют

keep = ["payment","payment_id","payment_amt", "clm_list", "dtl", "clm_id","adj","adj_id"] 

old_dict={"payment": {"payment_id": "AA340", "payment_amt": "20", "chk_nr": "321749", "clm_list": {"dtl": [{"clm_id": "1A2345", "name": "John", "adj": {"adj_id": "W123", "adj_cd": "45"}}, {"clm_id": "9999", "name": "Dilton", "adj": {"adj_id": "X123", "adj_cd": "5"}}]}}} 

def recursively_prune_dict_keys(obj, keep): 
     if isinstance(obj, dict): 
       return dict([(k, recursively_prune_dict_keys(v, keep)) for k, v in obj.items() if k in keep]) 
     elif isinstance(obj, list): 
       return [recursively_prune_dict_keys(item, keep) for item in obj] 
     else: 
       return obj 

new_dict = recursively_prune_dict_keys(old_dict, keep) 
conv_json=new_dict["payment"] 
print json.dumps(conv_json) 
+0

Если вам нужна помощь, вам нужно опубликовать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) кода, который вы пробовали. – CAB

+0

Обновлен с кодом – user3646519

ответ

0

Это может быть отличный способ, чтобы просто забрать через данные, как;

new_dict = recursively_prune_dict_keys(old_dict, keep) 
payment = old_dict['payment'] 
claims = payment['clm_list']['dtl'] 
for claim in claims: 
    claim['payment_amt'] = payment['payment_amt'] 
    claim['chk_nr'] = payment['chk_nr'] 
print(json.dumps(claims)) 

Это даст;

[{"chk_nr": "321749", "clm_id": "1A2345", "payment_amt": "20", "adj": {"adj_id": "W123"}}, {"chk_nr": "321749", "clm_id": "9999", "payment_amt": "20", "adj": {"adj_id": "X123"}}] 

Этот файл содержит данные, которые вы просили, но не так, как вы можете его видеть.

Во-первых, ваш желаемый результат неправильный JSON без квадратных скобок [], который сделал бы его список. Но мы можем избавиться от этого, сбросив каждое требование индивидуально;

new_dict = recursively_prune_dict_keys(old_dict, keep) 
payment = old_dict['payment'] 
claims = payment['clm_list']['dtl'] 
for claim in claims: 
    claim['payment_amt'] = payment['payment_amt'] 
    claim['chk_nr'] = payment['chk_nr'] 
    print(json.dumps(claim)) 

Это дает;

{"name": "John", "clm_id": "1A2345", "payment_amt": "20", "adj": {"adj_cd": "45", "adj_id": "W123"}, "chk_nr": "321749"} 
{"name": "Dilton", "clm_id": "9999", "payment_amt": "20", "adj": {"adj_cd": "5", "adj_id": "X123"}, "chk_nr": "321749"} 

Это близко к вашему желаемому выходу, за исключением, возможно, для заказа. Питоны-диктофоны по сути не заказываются. Однако вы можете отсортировать их. Итак, если заказ имеет важное значение, вам нужно будет прочитать How to Sort Python Dictionaries by Key or Value