简述
python2 json的学习和使用
注意
json 中对于字典中的字符串,不管是键还是值都用双引号,
使用单引号报错:
print json.loads(dict_msg)
File "C:Python27libjson__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "C:Python27libjsondecoder.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": "u4e2du6587 / 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)
>>> json_str = json.dumps(gbk_str)
Traceback (most recent call last):
File "", line 1, in
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)
>>> print json_str
"u4e2du6587"
将对象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)
参考