json序列化和反序列化方法,json反序列化失败是什么意思
大蟒中的字符串分普通字符串和采用双字节对字符进行编码字符串,一般从数据库中读取的字符串会自动被转换为采用双字节对字符进行编码字符串
1.使用json.dumps时,一般的用法为:obj={name :测试} JSON。dumps(obj) { name : u6d4b u8bd 5 } print(JSON。dumps(obj)){ name : u6d4b u8bd 5 } JSON。转储(obj).encode( utf-8 ) { name : u6d4b u8bd 5 } 可以看到这里输出的字符串为普通字符串,但是里面的内容却是采用双字节对字符进行编码字符串的内容,即使对结果进行编码(“utf-8”),因为这个字符串本身就已经编码过了,所有进行编码不会有变化
要想得到字符串的真实表示,需要用到参数确保_ascii=False(默认为True): json.dumps(obj,确保_ ascii=False) { name : xe6 xb5 x8b xe8 xaf x95 } print JSON。转储(对象,确保_ascii=False){name :测试} 2.坑:试试下面的用法(比如键是从数据库中读取的,则会以采用双字节对字符进行编码字符串形式存在):key=uname obj={key:测试} json.dumps(obj,确保_ascii=False)回溯(最近一次调用last):文件“标准输入”,第一行,在模块文件“/usr/lib 64/python 2.6/JSON/_ _ init _ _”中 py ,第237行,转储* *千瓦).编码(对象)文件"/usr/lib 64/python 2.6/JSON/encoder。py”,第368行,在编码返回""中连接(块)unicode解码错误:" ascii "编解码器无法解码位置一中的字节0xe6:序号不在范围内(128)这是因为键和价值不能以混合普通字符串和采用双字节对字符进行编码字符串的形式存在
改成下面则正常了(同时为普通字符串或同时为采用双字节对字符进行编码字符串):key=uname obj={key:u 测试} json.dumps(obj,确保_ ascii=False)u { name : u6d4b u8bd 5 } obj={ key。编码(“utf-8”):u测试encode(utf-8)} json.dumps(obj,确保_ ascii=False) { name : xe6 xb5 x8b xe8 xaf x95 } 3 .另外说说还有一个参数默认,用于转化不可序列化对象考虑下面的场景:
类别数据:def __init__(self):self.name= .self.detail= .data=Data() data.name=名字data.detail=细节obj={ data :data } JSON。转储(对象,确保_ascii=False)会报下面的异常:
追溯(最近一次调用最后):文件标准输入,第一行,在模块文件/usr/lib 64/python 2.6/JSON/_ _ init _ _ 中 py ,第237行,转储* *千瓦).encode(obj)File /usr/lib 64/python 2.6/JSON/encoder。py ,第367行,in _ ITER编码=列表(self。ITER编码(o))文件/usr/lib 64/python 2.6/JSON/encoder。py ,第309行,in _iterencode for chunk in self ._iterencode_dict(o,markers):File /usr/lib 64/python 2.6/JSON/encoder。py ,第275行,in _ ITER encode _ dict for chunk in self ._iterencode(value,markers):File /usr/lib 64/python 2.6/JSON/encoder。py ,第317行,in _iterencode for chunk in self ._iterencode_default(o,markers):File /usr/lib 64/python 2.6/JSON/encoder。py ,第323行,in _ ITER encode _ default new obj=self。默认(o)文件/usr/lib 64/python 2.6/JSON/encoder。py ,第344行,在默认情况下引发类型错误(repr(o)不是JSON serializable’)类型错误:_ main main _ _ .0x11e87e8处的数据实例不是数据可序列化的这是因为json.dumps不知道如何对数据对象进行序列化,需要定义一个函数,并赋给参数默认值:
def convert_to_builtin_type(obj):d={}.d。更新(obj .__字典_ _).返回d.json.dumps(obj,确保_ascii=False,default=convert _ to _ builtin _ type) { data :{ name : xe5 x90 x8d xe5 xad x97 , detail : xe7 xbb x86 xe8 x8a x82 } } print JSON。转储(对象,确保_ascii=False,default=convert _ to _ builtin _ type){ data :{ name :名字,详细信息: 细节}}