简述
python2 json的学习和使用
注意
json 中对于字典中的字符串,不管是键还是值都用双引号,
使用单引号报错:
print json.loads(dict_msg)
File "C:\Python27\lib\json\__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "C:\Python27\lib\json\decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer
可以用下面的方法转换
json_string=json.dumps(s)
python_obj=json.loads(json_string)
json的使用
在python中自带有json的处理模块,只需要import json就行
在python和json转换表
python 转 json
| python | json |
|---|---|
| dict | object |
| list, tuple | array |
| str, unicode | string |
| int, long, float | number |
| True | true |
| False | false |
| None | null |
json 转 python
| json | python |
|---|---|
| object | dict |
| array | list |
| string | unicode |
| number(int) | int, long |
| number(real) | float |
| true | True |
| false | False |
| null | None |
在json数据中false和true对应python中的False, True; null对应python中的None
注意:通过表可以看见在转换的时候tuple会转换成array,并且在通过load方式也只会转换成list,对于str编码都会转换成unicode,如果使用则需要在使用前添加适当处理
基本使用
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.dumps(data) #生成json字符串
json.dump(data,file) #生成json类文件对象
将json对象转换成python
json.loads(str) #解析json字符串
json.load(file) #解析json类文件对象
注意在使用loads方法时,若str为空会报错。
json中unicode使用
json中utf-8编码输出
>>> js = json.loads('{"language": "中文 / Chinese "}')
>>> print json.dumps(js)
{"language": "\u4e2d\u6587 / Chinese "}
>>> print json.dumps(js,ensure_ascii=False)
{"language": "中文 / Chinese "}
其他编码转换成json对象
可以看见在json.dumps(data)中默认encoding=utf-8转换成unicode编码,所以其他编码输入需要设置encoding
>>> str = u'中文'
>>> gbk_str = str.encode('gb2312')
>>> type(gbk_str)
<type 'str'>
>>> json_str = json.dumps(gbk_str)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/json/__init__.py", line 243, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
return encode_basestring_ascii(o)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
>>> json_str = json.dumps(gbk_str,encoding='gb2312')
>>> type(json_str)
<type 'str'>
>>> print json_str
"\u4e2d\u6587"
将对象json化
import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
s = Student('Bob', 20, 88)
对于dumps()方法,其中default参数定义了如何将任意一个对象变成可序列为json的对象,所以需要一个转换函数
def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
}
将类实例通过转换函数转换成dict,再序列化为json对象
json.dumps(s, default=student2dict)
可以使用实例的__dict__属性,dict属性用来存储实例变量
json.dumps(s, default=lambda obj: obj.__dict__)
json反序列化,loads()方法首先转换出一个dict对象,然后object_hook参数,将dict转换成类实例
def dict2student(d):
return Student(d['name'], d['age'], d['score'])
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
json.loads(json_str, object_hook=dict2student)
漂亮的输出
- 用
pprint()代替print输出,输出json - 添加indent参数,输出python对象
json.dumps(data, indent=4, ensure_ascii=False)