Python遞歸解析同盾返回的json數據

  • 啥也不說,以某盾的返回數據爲例,很多吐槽比較難解析!!
  • 數據中無限嵌套,嵌套的類型爲json 和 array
  • 數據是存在ElasticSearch中的,所以先看看
  • 雖然很長,但是結構無非是嵌套json 或者 list的格式,看下面結構(摘取了其中一小段)

  • ele={
    	'_source': {
    		'gmt_create': '2020-02-20 14:18:51',
    		'id_number': '33049319920423****',
    		'result_desc': {
    			'ANTIFRAUD': {
    				'final_score': 237,
    				'risk_items': [{
    					'rule_id': 28271704,
    					'policy_score': 237,
    					'score': 88,
    					'policy_mode': 'Weighted',
    					'decision': 'Accept',
    					'policy_decision': 'Reject',
    					'policy_name': 'STARK借款_網頁',
    					'risk_name': '身份證格式校驗錯誤'
    				}, {
    					'rule_id': 28272014,
    					'policy_score': 237,
    					'score': 30,
    					'policy_mode': 'Weighted',
    					'decision': 'Accept',
    					'policy_decision': 'Reject',
    					'policy_name': 'STARK借款_網頁',
    					'risk_name': '手機號格式校驗錯誤'
    				}]
    			}
    		}
    	}
    }

     

def get_flatten_json(dd,pre):
    '''
    :param dd: 爲一個json串
    :param pre:以某字符開頭
    :return: 返回拍平的結果,字典
    '''
    res={}
    def flatten_json(dd,pre):
        for k,v in dd.items():
            if isinstance(v,dict):
                pre0 = pre + '_' + k
                flatten_json(v,pre0)
            if isinstance(v,int) or isinstance(v,str):
                pre1=pre+"_"+k
                res[pre1[1:]]=v
                #res.append((pre1,v))
            if isinstance(v,list):
                for i,ele in enumerate(v):
                    pre2 = pre + "_" + k +str(i)
                    if isinstance(ele,dict):
                        flatten_json(ele,pre2)
    flatten_json(dd,pre)
    return res


result=get_flatten_json(ele,"")     ### 這裏調用下函數就好

輸出:

{
	'_source_gmt_create': '2020-02-20 14:18:51',
	'_source_id_number': '33049319920423****',
	'_source_result_desc_ANTIFRAUD_final_score': 237,
	'_source_result_desc_ANTIFRAUD_risk_items0_rule_id': 28271704,
	'_source_result_desc_ANTIFRAUD_risk_items0_policy_score': 237,
	'_source_result_desc_ANTIFRAUD_risk_items0_score': 88,
	'_source_result_desc_ANTIFRAUD_risk_items0_policy_mode': 'Weighted',
	'_source_result_desc_ANTIFRAUD_risk_items0_decision': 'Accept',
	'_source_result_desc_ANTIFRAUD_risk_items0_policy_decision': 'Reject',
	'_source_result_desc_ANTIFRAUD_risk_items0_policy_name': 'STARK借款_網頁',
	'_source_result_desc_ANTIFRAUD_risk_items0_risk_name': '身份證格式校驗錯誤',
	'_source_result_desc_ANTIFRAUD_risk_items1_rule_id': 28272014,
	'_source_result_desc_ANTIFRAUD_risk_items1_policy_score': 237,
	'_source_result_desc_ANTIFRAUD_risk_items1_score': 30,
	'_source_result_desc_ANTIFRAUD_risk_items1_policy_mode': 'Weighted',
	'_source_result_desc_ANTIFRAUD_risk_items1_decision': 'Accept',
	'_source_result_desc_ANTIFRAUD_risk_items1_policy_decision': 'Reject',
	'_source_result_desc_ANTIFRAUD_risk_items1_policy_name': 'STARK借款_網頁',
	'_source_result_desc_ANTIFRAUD_risk_items1_risk_name': '手機號格式校驗錯誤'
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章