2025年3月13日 星期四 甲辰(龙)年 月十二 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 系统应用 > Windows

完整的示例 python解析json字符串

时间:01-18来源:作者:点击数:24

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)
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门