简述
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)