python json 中文
python中自带了处理python的模块,使用时候直接import json即可。使用loads方法即可将json字符串转换成python对象。
一、但在使用json模块的时候需要注意的是对中文的处理,loads方法如果传入的字符串的编码不是UTF-8的话,需要用encoding指定字符编码
#!/usr/bin/env python # -*- coding:utf-8 -*- import json js = json.loads('{"insun": "泰囧 / 人在囧途2 / Lost in Thailand "}') print json.dumps(js) print json.dumps(js,ensure_ascii=False)
打印效果如下:
{“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,就可以了。
代码如下:
dataJsonStrUni = dataJsonStr.decode("GB2312"); dataDict = json.loads(dataJsonStrUni, encoding="GB2312");
官网:
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模块解码中文的BUG http://www.douban.com/note/214822809/
- 使用python处理json http://www.giser.net/?p=990
- python下调用json.dumps中文显示问题解决办法 http://blog.csdn.net/sagittar/article/details/6169605
- Python解析json数据结构范例 http://hi.baidu.com/leejun_2005/item/fc688affc196f8723c198b7c
- Python中json.loads解析包含n的字符串会出错 http://www.crifan.com/use_python_json_loads_parse_string_contain_newline_will_fail_error/
————————-
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示例:
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://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)
<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’: ‘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)
<type ‘dict’>
其次,我们以读字典中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’])
<type ‘list’>
发现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/
==============================
———————————————————-
#!/usr/bin/env python #coding=utf-8 import json s = '[{"name":"鸟巢","point":{"lat":"39.990","lng":"116.397"},"desc":"奥运会主场地"},{"name":"北大乒乓球馆","point":{"lat":"39.988","lng":"116.315"},"desc":"乒乓球比赛场地"},{"name":"北京工人体育场","point": {"lat":"39.930","lng":"116.446"},"desc":"足球比赛场地"}]' locations = json.read(s) #注:read是json-py.py和minijson.py的方法,而python2.6开始自带的lib库里用的是simplejson.py,其没有read方法,而是load/loads print str(len(locations)) #因为json.load()之后的对象就是dict类型的! for location in locations: print location["name"] print location["point"]["lat"]
———————————————————-
#!/usr/local/bin/python #coding = utf-8 import os import json Res='[{"brief":"ooooo","class_extid":13,"create_time":1131783174,"face_id":4,"flag":6777217,"flag_ext":0,"level":0,"max_member":100,"memo":"m~F~M0m~Zm~@~B","name":"10502","option":2,"ul":[{"flag":4,"u":285},{"flag":4,"u":35}]}]' qDic = json.loads(Res) for i in qDic: print i["class_extid"] for j in i["ul"]: print str(j["flag"]) + "===" + str(j["u"])
==========================================================
更多范例请参考 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’]
———————-
#!/usr/bin/env python # coding=utf-8 import json f = file("baidu_nav_json.txt"); #baidu_nav_json.txt是我的百度首页中的导航,查看源码,将其内容保存下来存为文件(utf-8格式) s = json.load(f) #print type(s) print str(len(s)) # 4 print s.keys() # [u'errNo', u'data', u'isNplus', u'defaultDirId'] #print s["data"] #print s["data"][10]["navs"][0] #print s["data"][10]["navs"][0]["name"], s["data"][10]["navs"][0]["url"] for i in range(0, len(s["data"])): print s["data"][i]["dirName"] for j in range(0, len(s["data"][i]["navs"])): print s["data"][i]["navs"][j]["name"], s["data"][i]["navs"][j]["url"] print #### f.close
———————-
下面给出一个使用python解析json的简单例子:
#!/usr/bin/python import json #Function:Analyze json script #Json is a script can descript data structure as xml, #for detail, please refer to "http://json.org/json-zh.html". #Note: #1.Also, if you write json script from python, #you should use dump instead of load. pleaser refer to "help(json)". #json file: #The file content of temp.json is: #{ # "name":"00_sample_case1", # "description":"an example." #} #f = file("temp.json"); #s = json.load(f) #print s #f.close #json string: s = json.loads('{"name":"test", "type":{"name":"seq", "parameter":["1", "2"]}}') print s print s.keys() print s["name"] print s["type"]["name"] print s["type"]["parameter"][1]
《 “Python解析json学习” 》 有 3 条评论
json.read()方法已经被废除
Python2.6 开始加入了JSON模块,无需另外下载,Python的Json模块序列化与反序列化的过程分别是 encoding 和 decoding
encoding:把一个Python对象编码转换成Json字符串( json.dumps() )
decoding:把Json格式字符串解码转换成Python对象( json.loads() )
对于简单数据类型(string、unicode、int、float、list、tuple、dict),可以直接处理。
https://docs.python.org/2/library/json.html
大感谢!帮我解决了大问题,好文啊,中文转化好心塞