python解析json字符串
#coding=utf-8
import json
from pprint import *
from jsonpath_rw import jsonpath, parse
#import simplejson
#import demjson
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
json_content = """
{
"A": "root A",
"B": "root B",
"C": {
"A": "CA",
"B": "CB",
"C": "CC",
"D": "CD"
},
"D": [{
"A": "DA1",
"B": "DB1",
"C": "DC1",
"D": "DD1"
},
{
"A": "DA2",
"B": "DB2",
"C": "DC2",
"D": "DD2"
}],
"result": {
"A": "result A",
"B": "result B",
"C": {
"A": "result CA",
"B": "result CB",
"C": "result CC",
"D": "result CD"
},
"D": [{
"A": "result DA1",
"B": "result DB1",
"C": "result DC1",
"D": "result DD1"
},
{
"A": "result DA2",
"B": "result DB2",
"C": "result DC2",
"D": "result DD2"
}]
}
}
"""
json_relation = """<items>
<item interfacename='OUTA' tagname='a'/>
<item interfacename='OUTB' tagname='b'/>
<item interfacename='OUTC' tagname='C'/>
<item interfacename='OUTD' tagname='D'/>
</items>
"""
doctor_content = """
{
"Response": {
"ResultCode": "0",
"ErrorMsg": "1",
"List": {
"Item": [
{
"DoctorID": "13121",
"DoctorName": "李师师",
"RegTypeID": "1",
"RegScheduleCode": "12",
"FeeType": "药事二级医院挂号费",
"ScheduleTime": "全日(08:00-07:59)",
"RegCount": "187",
"LimitCount": "200",
"DoctorLevel": "主任医师",
"TotalCost": "11.5",
"List1": {
"Item1": [
{
"FeeID": "80100",
"FeeName": "药事二级医院挂号费",
"Unit": "次",
"Number": "1.00",
"Price": "1.50",
"ShouldMoney": "1.50",
"ActualMoney": "1.50"
},
{
"FeeID": "80101",
"FeeName": "门(急)诊药事服务费",
"Unit": "人次",
"Number": "1.00",
"Price": "10.00",
"ShouldMoney": "10.00",
"ActualMoney": "10.00"
}
]
}
},
{
"DoctorID": "13121",
"DoctorName": "李师师",
"RegTypeID": "1",
"RegScheduleCode": "12",
"FeeType": "药事二级医院挂号费",
"ScheduleTime": "全日(08:00-07:59)",
"RegCount": "187",
"LimitCount": "200",
"DoctorLevel": "主任医师",
"TotalCost": "11.5",
"List1": {
"Item1": [
{
"FeeID": "80102",
"FeeName": "药事二级医院挂号费",
"Unit": "次",
"Number": "1.00",
"Price": "1.50",
"ShouldMoney": "1.50",
"ActualMoney": "1.50"
},
{
"FeeID": "80103",
"FeeName": "门(急)诊药事服务费",
"Unit": "人次",
"Number": "1.00",
"Price": "10.00",
"ShouldMoney": "10.00",
"ActualMoney": "10.00"
}
]
}
}
]
}
}
}
"""
doctor_relation = """<items>
<item interfacename='OUTFeeID' tagname='FeeID'/>
<item interfacename='OUTFeeName' tagname='FeeName'/>
<item interfacename='OUTUnit' tagname='Unit'/>
<item interfacename='OUTNumber' tagname='Number'/>
<item interfacename='OUTPrice' tagname='Price'/>
<item interfacename='OUTShouldMoney' tagname='ShouldMoney'/>
<item interfacename='OUTActualMoney' tagname='ActualMoney'/>
</items>
"""
def ParseJson(request):
jsonObj = JsonObject()
return jsonObj.EnParseJson(request)
class JsonObject:
'Json操作类 2017-08-01/yx'
#入参校验
def __CheckRequest(self, request):
if 'strContent' not in request.keys():
raise BaseException('strContent field is not find')
if 'strMappingRelation' not in request.keys():
raise BaseException('strMappingRelation field is not find')
if 'strParseitemFlag' not in request.keys():
raise BaseException('strParseitemFlag field is not find')
#获取映射关系
def __GetRelation(self, relation):
dict = {}
try:
items = ET.fromstring(relation)
except BaseException as e:
return None
for item in items.findall('item'):
infname = item.get('interfacename')
tagname = item.get('tagname')
if infname and tagname:
dict[infname] = tagname
return dict if dict else None
#获取给定字典给定key的值,多层节点用'/'分隔: root/child1/child2
def __GetChildDict(self, text, tagflag):
childtext = text
tagList = tagflag.split("/")
for i in range(len(tagList)):
childparam = tagList[i]
if isinstance(childtext, dict):
for (k, v) in childtext.items():
if childparam.lower() == str(k).lower():
childtext = v
break
return childtext
def __GetJsonPathList(self, text, jsonPath):
jsonpath_expr = parse(jsonPath)
recordList = [match.value for match in jsonpath_expr.find(text)]
return recordList
#组合输出集合
def __GroupResponse(self, dict_rel, dict_record, list_response):
item = {}
for (k, v) in dict_rel.items():
value = ''
for (m, n) in dict_record.items():
if str(v).lower() == str(m).lower():
value = str(n)
break
if value != '':
item[k] = value
if item:
list_response.append(item)
#解析Json字符串
def EnParseJson(self, request):
self.__CheckRequest(request)
sContent = request['strContent']
sMappingrelation = request['strMappingRelation']
sParseitemflag = request['strParseitemFlag']
response = []
dict_rel = self.__GetRelation(sMappingrelation)
if dict_rel is None:
raise BaseException('parse json sting has no mapping relation.')
try:
text = json.loads(sContent)
#text = simplejson.loads(content)
#text = demjson.decode(content)
except BaseException as e:
raise BaseException(e.message)
if sParseitemflag == "":
if isinstance(text, dict):
self.__GroupResponse(dict_rel, text, response)
return response
#result = self.__GetChildDict(text, sParseitemflag)
result = self.__GetJsonPathList(text, sParseitemflag)
if isinstance(result, list):
for i in result:
record = i
if isinstance(record, dict):
self.__GroupResponse(dict_rel, record, response)
elif isinstance(result, dict):
self.__GroupResponse(dict_rel, result, response)
return response
"""
###########解析Json函数入参说明###########
strContent: 待解析的Json字符串
strMappingRelation: 接口出参节点和待解析的Json节点之间的映射关系,以xml的形式传入
strParseitemFlag: 待解析的主节点标识
"""
if __name__ == "__main__":
try:
request = {}
request['strContent'] = json_content
request['strMappingRelation'] = json_relation
request['strParseitemFlag'] = '$'
print("1:root")
pprint(ParseJson(request))
request['strParseitemFlag'] = '$.C'
print("\n2:C")
pprint(ParseJson(request))
request['strParseitemFlag'] = '$.D[*]'
print("\n3:D")
pprint(ParseJson(request))
request['strParseitemFlag'] = '$.result'
print("\n4:result")
pprint(ParseJson(request))
request['strParseitemFlag'] = '$.result.C'
print("\n5:result/C")
pprint(ParseJson(request))
request['strParseitemFlag'] = '$.result.D[*]'
print("\n6:result/D")
pprint(ParseJson(request))
request['strContent'] = doctor_content
request['strMappingRelation'] = doctor_relation
request['strParseitemFlag'] = '$.Response.List.Item[*].List1.Item1[*]'
print("\n6:doctor")
pprint(ParseJson(request))
except BaseException as e:
print(e.message)