pythonjson中list操作_Python3中json的操纵

在python中提供了标准库json将基本类型的数据转化成json格式,但是在涉及到自定义类型时需要扩展或者复写Encoder(Decoder)来实现,默认情况下json会抛出"TypeErro: xxx is not json serializable"的错误。本文参考了文章

232705_wE2S_870846.jpeg

基本类型的序列化/反序列化

对于基本类型的数据直接使用json.dumps和json.loads方法进行序列化和反序列化。

import json

array = ['d', 'b', 'c', 'a', {'b':100, 'a':'letter a'}]

encodestr = json.dumps(array)

org_obj = json.loads(encodestr)

在json序列化和反序列化过程中基本类型和字符串的对应关系:

JSON

Python

Object

dict

Array

list

String

str

number(int)

int

number(real)

float

true

True

false

False

null

None     序列化函数dumps的几个常用参数:

separators: 指定生成的json字符串所用的分隔符,两个分别用于代替“,”、“:”。

indent:    用于格式化生成的json字符串,接受整数参数的缩进量。

sort_key: true/false,指定dict在序列化时是否按照key排序。

json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4, separators=(',', ': '))

自定义类型的序列化——使用函数

json.dumps函数接受参数default用于指定一个函数,该函数能够把自定义类型的对象转换成可序列化的基本类型。json.loads函数接受参数objecthook用于指定函数,该函数负责吧反序列化后的基本类型对象转换成自定义类型的对象。

boy1 = boy('Will', 20)

#default method for decode

def boydefault(obj):

if isinstance(obj, boy):

return {'name': obj.name, 'age': obj.age}

return obj;

def boyhook(dic):

print('test')

if dic['name']:

return boy(dic['name'], dic['age'])

return dic

boy_encode_str = json.dumps(boy1, default=boydefault)

new_boy = json.loads(boy_encode_str, object_hook=boyhook)

print(boy_encode_str)

print(new_boy)

自定义类型的序列化——使用类

除此以外json库提供了JSONEncoder和JSONDecoder两个类用于json的序列化和反序列化,可以通过子类实现自定义类的json操作(估计json库内部逻辑也是用的这两个类)。

json.JSONEncoder的主要方法:

default:目的和dumps的default参数一样。

encode:实现序列化的逻辑部分。     json.JSONDecoder的方法就是decode    这里有两个思路一个是重载Decoder的构造函数设置object_hook,另一个是重载Decoder的decode方法添加由dict转换为自定义类的逻辑。

class BoyEncoder(json.JSONEncoder):

def default(self, o):

if isinstance(o, boy):

return {'name': o.name, 'age': o.age}

return json.JSONEncoder.default(o);

#override decode method

class BoyDecoder(json.JSONDecoder):

def decode(self, s):

dic = super().decode(s);

return boy(dic['name'], dic['age']);

#override __init__ method

class BoyDecoder2(json.JSONDecoder):

def __init__(self):

json.JSONDecoder.__init__(self)

self.object_hook = boyhook

boy_encode_str = json.dumps(boy1, cls=BoyEncoder)

new_boy = json.loads(boy_encode_str, cls=BoyDecoder)

new_boy2 = json.loads(boy_encode_str, cls=BoyDecoder2)

print(boy_encode_str)

print(new_boy)

print(new_boy2)

使用两种中的任意一种都可以达到这个目的,不过请注意上述代码已测试但是省略了一些简单的非必要代码,如果有朋友想测试请自行补充:)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值