python中自带了处理python的模块,使用时候直接import json即可。使用loads方法即可将json字符串转换成python对象。
一、但在使用json模块的时候需要注意的是对中文的处理,loads方法如果传入的字符串的编码不是UTF-8的话,需要用encoding指定字符编码
打印效果如下:
{“insun”: “u6cf0u56e7 / u4ebau5728u56e7u90142 / Lost in Thailand “}
{“insun”: “泰囧 / 人在囧途2 / Lost in Thailand “}
二、如果传入的字符串的编码不是UTF-8的话,需要用encoding指定字符编码。对于:
dataDict = json.loads(dataJsonStr);
其中dataJsonStr是json字符串,如果其编码本身是非UTF-8的话,比如是GB2312的,那么上述代码,就会导致出错。改为对应的:
dataDict = json.loads(dataJsonStr, encoding=”GB2312”);
就可以了。
此处,即对应着上面函数解释中的:
If s is a str instance and is encoded with an ASCII based encoding other than UTF-8 (e.g. latin-1), then an appropriate encoding name must be specified.
三、如果要解析的字符串,本身的编码类型,不是基于ASCII的,那么,调用json.loads之前,需要先将对应字符串,转换为Unicode类型。
还是以上述的:
dataDict = json.loads(dataJsonStr, encoding=”GB2312″);
为例,即使你此处的字符串dataJsonStr,已经通过encoding指定了合适的编码,但是由于其中,包含了其他的编码的字符,比如我本身 dataJsonStr 是GB2312的字符,但是其中又包含了的一些日文字符,此时,json.loads还是会出错,因为此处的 dataJsonStr 不是以ASCII为基础的字符编码,所以,需要先去将dataJsonStr转换为Unicode,然后再调用 json.loads,就可以了。
代码如下:
官网:
18.2. json — JSON encoder and decoder
http://docs.python.org/2/library/json.html
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True,cls=None, indent=None, separators=None, encoding=”utf-8″, default=None, sort_keys=False, **kw)
json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[,object_pairs_hook[, **kw]]]]]]]])
参考:
————————-
Python解析json数据结构范例
一、JSON的格式:
1,对象:
{name:”Peggy”,email:”[email protected]”,homepage:”http://www.peggy.com”}
{ 属性 : 值 , 属性 : 值 , 属性 : 值 }
2,数组是有顺序的值的集合。一个数组开始于”[“,结束于”]”,值之间用”,”分隔。
[
{name:”Peggy”,email:”[email protected]”,homepage:”http://www.peggy.com”}, {name:”Peggy”,email:”[email protected]”,homepage:”http://www.peggy.com”},
{name:”Peggy”,email:”[email protected]”,homepage:”http://www.peggy.com”}
]
3, 值可以是字符串、数字、true、false、null,也可以是对象或数组。这些结构都能嵌套。
4,json示例:
5,simplejson 示例:
二、python从web接口上查询信息
1,先看个例子
>>> import urllib
>>> url=’http://www.example.com/’
>>> page=urllib.urlopen(url)
>>> data=page.read()
>>> print data //这个就是json的数据结构,str类型
{“total”:1,”data”:[{“oume”:””,”asNum”:”33333″,”cabinet”:”22″,”dMel”:”rr”,”hostname”:”h1.bkeep.com”,”logicSite”:”99″,”menfo”:{“amount”:4,”size”:8192},”ip”:”2.16.20.13″,”isOnline”:true,”useState”:”888″,”serviceTag”:”222X”,”cpuInfo”:{“amount”:2,”masterFrequency”:1995,”model”:”Intel(R) Xeon(R) CPU E5405 @ 2.00GHz”,”coreNum”:8,”l2CacheSize”:6144},”cabinetPositionNum”:””,”buyTime”:”2009-06-29″,”manageIp”:”2.31.58.223″,”idc”:”腾讯机房”,”resperson”:”马化腾”}],”errorMsg”:””,”isSuccess”:true}
>>> type(data)
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’: ‘xe6x9dxadxe5xb7f’, ‘assetsNum’: ‘227003’, ‘responsibilityPerson’: ‘xe4xb9’, ‘deviceModel’: ‘a 1950’, ‘serviceTag’: ‘233’, ‘ip’: ‘2.1.20.163’, ‘hostname’: ‘h.bkeep.com’, ‘manageIp’: ‘2.31.58.223’, ‘cabinet’: ‘H05’, ‘buyTime’: ‘2009-06-29’, ‘useState’: ‘xe4xbd’, ‘memoryInfo’: {‘amount’: 4, ‘size’: 8192}, ‘cpuInfo’: {‘coreNum’: 8, ‘l2CacheSize’: 6144, ‘amount’: 2, ‘model’: ‘Intel(R) Xeon(R) CPU E5405 @ 2.00GHz’, ‘mastncy’: 1995}, ‘cabineionNum’: ”, ‘outGuime’: ”, ‘logicSite’: ‘xe46x969’}]}
>>>
看看ddata已经是dict类型了
>>> type(ddata)
其次,我们以读字典中key 为”data”对应的键值
>>> ddata[‘data’] //查看字典的方法!
[{‘isOnline’: True, ‘idc’: ‘xe6x9dxadxee6x88xbf’, ‘assetsNum’: ‘B50070100007003’, ‘responsibilityPerson’: ‘xe5xafx9a’, ‘deviceModel’: ‘PowerEdge 1950’, ‘serviceTag’: ‘7292X’, ‘ip’: ‘2.16.20.163’, ‘hostname’: ‘h1.bkeep.com’, ‘manageIp’: ‘2.31.58.223’, ‘cabinet’: ‘H05’, ‘buyTime’: ‘2009-06-29’, ‘useState’: ‘xe4xbdxbfe4xb8xad’, ‘memoryInfo’: {‘amount’: 4, ‘size’: 8192}, ‘cpuInfo’: {‘coreNum’: 8, ‘l2Caze’: 6144, ‘amount’: 2, ‘model’: ‘Intel(R) Xeon(R) CPU E5405 @ 2.00GHz’, ‘masterFrequency’: 1995}, ‘cabinetonNum’: ”, ‘outeTime’: ”, ‘logicSite’: ’87xe7xabx99′}]
>>>type(ddata[‘data’])
发现ddata[‘data’]是一个列表,列表就要用序号来查询
>>> ddata[‘data’][0] //查看列表的方法!
{‘isOnline’: True, ‘idc’: ‘xe6x9d’, ‘assetsNum’: ‘07003’, ‘resposon’: ‘xe5xbc\xafx9a’, ‘deviceModel’: ‘PowerEdge 1950’, ‘serviceTag’: ‘7002X’, ‘ip’: ‘2.16.20.163’, ‘hostname’: ‘h1.bkeep.com’, ‘manageIp’: ‘2.31.58.223’, ‘cabinet’: ‘H05’, ‘buyTime’: ‘2009-06-29’, ‘useState’: ‘x94xa8xe4x8xad’, ‘memoryInfo’: {‘amount’: 4, ‘size’: 8192}, ‘cpuInfo’: {‘coreNum’: 8, ‘l2CacheSize’: 6144, ‘amount’: 2, ‘model’: ‘Intel(R) Xeon(R) CPU E5405 @ 2.00GHz’, ‘masterFrequency’: 1995}, ‘cabinetPx99’}
>>>
呵呵,ddata[‘data’]列表的0号元素是个字典。。
好,那我们查查key为idc的键值是多少
>>> ddata[‘data’][0][‘idc’] //查看字典的方法!
‘xe6x8xbf’
>>> print ddata[‘data’][0][‘idc’]
深圳腾讯机房
看到这里终于明白怎么解析json数据结构了。。。那就是“一层一层往下剥”
【Python】 如何解析json数据结构 – bkeep的日志 – 网易博客http://bkeep.blog.163.com/blog/static/12341429020113156582685/
==============================
———————————————————-
———————————————————-
==========================================================
更多范例请参考 http://docs.python.org/library/json.html
=======================================
>>> import json
>>> dir(json)
[‘JSONDecoder’, ‘JSONEncoder’, ‘__all__’, ‘__author__’, ‘__builtins__’, ‘__doc__’, ‘__file__’, ‘__name__’, ‘__package__’, ‘__path__’, ‘__version__’, ‘_default_decoder’, ‘_default_encoder’, ‘decoder’, ‘dump’, ‘dumps’, ‘encoder’, ‘load’, ‘loads’, ‘scanner’]
———————-
———————-
下面给出一个使用python解析json的简单例子: