json在python下的解析 这个事json的官方网站,上面有很多json工具的介绍,和json的原理性介绍。 dos下面simplejson的安装,先配置系统变量里面的path至C:/python27/,然后进入simplejson的目录,输入python.exe setup.py install这个命令,执行安装程序即可。 一、JSON的格式: 1,对象: {name:"Peggy",email:"peggy@gmail.com",homepage:"http://www."} { 属性 : 值 , 属性 : 值 , 属性 : 值 },必须是大括号未外表,如果不是大括号,则把大括号外边的内容过滤掉。
2,数组是有顺序的值的集合。一个数组开始于"[",结束于"]",值之间用","分隔。 [ {name:"Peggy",email:"peggy@gmail.com",homepage:"http://www."}, {name:"Peggy",email:"peggy@gmail.com",homepage:"http://www."}, {name:"Peggy",email:"peggy@gmail.com",homepage:"http://www."} ] 3, 值可以是字符串、数字、true、false、null,也可以是对象或数组。这些结构都能嵌套。
4,json示例: import json # Converting Python to JSON json_object = json.write( python_object ) # Converting JSON to Python python_object = json.read( json_object )
5,simplejson 示例: import simplejson # Converting Python to JSON json_object = simplejson.dumps( python_object ) # Converting JSON to Python python_object = simplejson.loads( json_object )
二、python从web接口上查询信息 1,先看个例子 >>> import urllib >>> url='http://a./page/api/saInterface/searchServerInfo.htm?serviceTag=729HH2X' >>> page=urllib.urlopen(url) >>> data=page.read() >>> print data //这个就是json的数据结构,str类型 {"total":1,"data":[{"outGuaranteeTime":"","assetsNum":"B50070100007003","cabinet":"H05","deviceModel":"PowerEdge 1950","hostname":"hzshterm1.alibaba.com","logicSite":"中文站","memoryInfo":{"amount":4,"size":8192},"ip":"172.16.20.163","isOnline":true,"useState":"使用中","serviceTag":"729HH2X","cpuInfo":{"amount":2,"masterFrequency":1995,"model":"Intel(R) Xeon(R) CPU E5405 @ 2.00GHz","coreNum":8,"l2CacheSize":6144},"cabinetPositionNum":"","buyTime":"2009-06-29","manageIp":"172.31.58.223","idc":"杭州德胜机房","responsibilityPerson":"张之诚"}],"errorMsg":"","isSuccess":true} >>> type(data) <type 'str'>
2,有了json数据结构,我却不知道怎么把它解析出来,幸亏有了李建辉的指导。大概思路是: 首先,json基本上是key/value的,python中就叫字典。既然是字典,那就应该安照读字典的方式去读。 将上面的data转为字典类型,这里用json模块的read方法。
>>> import json >>> ddata=json.read(data) >>> ddata {'isSuccess': True, 'errorMsg': '', 'total': 1, 'data': [{'isOnline': True, 'idc': '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf', 'assetsNum': 'B50070100007003', 'responsibilityPerson': '\xe5\xbc\xa0\xe4\xb9\x8b\xe8\xaf\x9a', 'deviceModel': 'PowerEdge 1950', 'serviceTag': '729HH2X', 'ip': '172.16.20.163', 'hostname': 'hzshterm1.alibaba.com', 'manageIp': '172.31.58.223', 'cabinet': 'H05', 'buyTime': '2009-06-29', 'useState': '\xe4\xbd\xbf\xe7\x94\xa8\xe4\xb8\xad', 'memoryInfo': {'amount': 4, 'size': 8192}, 'cpuInfo': {'coreNum': 8, 'l2CacheSize': 6144, 'amount': 2, 'model': 'Intel(R) Xeon(R) CPU E5405 @ 2.00GHz', 'masterFrequency': 1995}, 'cabinetPositionNum': '', 'outGuaranteeTime': '', 'logicSite': '\xe4\xb8\xad\xe6\x96\x87\xe7\xab\x99'}]} >>> 看看ddata已经是dict类型了 >>> type(ddata) <type 'dict'>
其次,我们以读字典中key 为”data”对应的键值 >>> ddata['data'] //查看字典的方法! [{'isOnline': True, 'idc': '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf', 'assetsNum': 'B50070100007003', 'responsibilityPerson': '\xe5\xbc\xa0\xe4\xb9\x8b\xe8\xaf\x9a', 'deviceModel': 'PowerEdge 1950', 'serviceTag': '729HH2X', 'ip': '172.16.20.163', 'hostname': 'hzshterm1.alibaba.com', 'manageIp': '172.31.58.223', 'cabinet': 'H05', 'buyTime': '2009-06-29', 'useState': '\xe4\xbd\xbf\xe7\x94\xa8\xe4\xb8\xad', 'memoryInfo': {'amount': 4, 'size': 8192}, 'cpuInfo': {'coreNum': 8, 'l2CacheSize': 6144, 'amount': 2, 'model': 'Intel(R) Xeon(R) CPU E5405 @ 2.00GHz', 'masterFrequency': 1995}, 'cabinetPositionNum': '', 'outGuaranteeTime': '', 'logicSite': '\xe4\xb8\xad\xe6\x96\x87\xe7\xab\x99'}]
>>>type(ddata[‘data’]) <type 'list'>
发现ddata[‘data’]是一个列表,列表就要用序号来查询 >>> ddata['data'][0] //查看列表的方法! {'isOnline': True, 'idc': '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf', 'assetsNum': 'B50070100007003', 'responsibilityPerson': '\xe5\xbc\xa0\xe4\xb9\x8b\xe8\xaf\x9a', 'deviceModel': 'PowerEdge 1950', 'serviceTag': '729HH2X', 'ip': '172.16.20.163', 'hostname': 'hzshterm1.alibaba.com', 'manageIp': '172.31.58.223', 'cabinet': 'H05', 'buyTime': '2009-06-29', 'useState': '\xe4\xbd\xbf\xe7\x94\xa8\xe4\xb8\xad', 'memoryInfo': {'amount': 4, 'size': 8192}, 'cpuInfo': {'coreNum': 8, 'l2CacheSize': 6144, 'amount': 2, 'model': 'Intel(R) Xeon(R) CPU E5405 @ 2.00GHz', 'masterFrequency': 1995}, 'cabinetPositionNum': '', 'outGuaranteeTime': '', 'logicSite': '\xe4\xb8\xad\xe6\x96\x87\xe7\xab\x99'} >>>
呵呵,ddata[‘data’]列表的0号元素是个字典。。 好,那我们查查key为idc的键值是多少 >>> ddata['data'][0]['idc'] //查看字典的方法! '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf' >>> print ddata['data'][0]['idc'] //呵呵,为什么print搞出来的是汉字呢? 杭州德胜机房
看到这里终于明白怎么解析json数据结构了。。。 那就是”一层一层往下剥” json是很方便的web数据格式,特别是用在ajax的数据处理上。许多Python的框架都是使用 simplejson 包来进行处理。不过最近发现我有这样的一个需求,比如我想把一个Python的数据结构转为javascript数据结构,也就是将python的数据结构转为json格式,然后用在模板中使用。如,我有一个模板,其中有javascript代码: <html> <head> <title>Title</title> <script type="text/javascript"> s = {{=data}} </script> </head> <body></body> </html> 上面的data我可以这样处理: def index(): data = {'name':'limodou'}; return dict(data=simplejson.dumps(data)) 这样,通过simplejson.dumps可以将一个python的数据结构转为json格式,结果为: {"name": "limodou"} 那么,它可以正确处理基本的数据类型。使用它,要求你传入的数据应该是基本的。但是这里可能有问题: 如何处理非基本类型数据。比如从数据库中读出的日期,一般都是datetime类型,它不是基本类型,直接传入simplejson会报错 如果我不希望是"limodou",而是limodou能不能呢?为什么会有这个需求,因为在我生成的js代码中,有些可能是函数名,或执行语句,因此不是字符串,不希望自动加引号 对于第一个问题,simplejson的主页和代码中都有例子,方法就是从JSONEncoder中派生子类,然后覆盖default方法,对于特殊的类型进行处理就可以了。 对于第二个,simplejson好象没有什么支持,于是我做了扩展: import simplejson as sj class ComplexEncoder(sj.JSONEncoder): def __init__(self, classes=[], **kwargs): sj.JSONEncoder.__init__(self, **kwargs) if not isinstance(classes, (tuple, list)): self.classes = [classes] else: self.classes = list(classes) def _iterencode_default(self, o, markers=None): for _cls in self.classes: if isinstance(o, _cls): return o() newobj = self.default(o) return self._iterencode(newobj, markers) class R: def __init__(self, obj): self.obj = obj def __call__(self): return self.obj def dumps(obj, classes=R): return sj.dumps(obj, cls=ComplexEncoder, classes=classes) 我定义了一个自已的Encoder类,然后覆盖了__init__()方法和_iterencode_default()方法。这样允许对特殊类调用类的转换方法,这样ComplexEncoder就不会对特殊类进行特殊处理了,其结果为特殊类的输出。举例: >>> print dumps({'a':'dddddd', 'b':R('sssssss')}) {"a": "dddddd", "b": sssssss} 可以看出sssssss前后就没有双引号了。 《转载嘿~》 |
|
来自: java_laq小馆 > 《Python》