之前写 py 关于 JSON 的序列化都是用字典来操作,比较不方便,今儿实现下 json->object 的序列化方式,发现还挺方便,分享给大家。py 菜鸟,大佬轻喷。。。使用方法如下:
核心类:
class JsonClass(object):
def to_json_string(self):
return json.dumps(self, default=lambda obj: obj.__dict__)
def from_json_string(self, json_string):
data = json.loads(json_string)
for key in self.__dict__.keys():
setattr(self, key, data[key])
使用方法:
class Task(JsonClass):
def __int__(self, id=None, name=None, timestamp=None):
self.id = id
self.name = name
self.timestamp = timestamp
if __name__ == '__main__':
# 序列化
task = Task(1, "a", time.time())
print(task.to_json_string())
# 反序列化
json_string = '{"timestamp": 1560948789.5293133, "name": "a", "id": 1}'
task = Task()
task.from_json_string(json_string)
1
pushyzheng OP 搭配 py3.6 类型标记食用更佳
|
2
xiangyuecn 2019-06-19 21:14:09 +08:00
看标题还以为是自己写的解析,没想到还是调用的 api 😂
|
3
rogwan 2019-06-19 21:30:16 +08:00
对比 字典 <--> json 的方式,是由性能优势?还是空间优势?
|
4
siteshen 2019-06-19 21:45:27 +08:00
两点建议:
1. 类名叫 JsonSerializableMixin,否则看到类名 JsonClass 会觉得是个特别重大的功能; 2. from_json_string 改为 class method,因为 from_json_string 的意思其实是 create OBJECT from json string,所以由这个函数负责创建对象。如果函数名是类似 update_with_json_string 则没这个意义不明确的问题。 |
5
misaka19000 2019-06-19 21:48:48 +08:00
。。。鼓励一下
|
6
BingoXuan 2019-06-19 21:49:37 +08:00
然而实质还是序列化和反序列化字典,因为字典是最接近 json 的结构的。lz 可以试一下这个,访问字典值如同访问对象属性。json.dumps 依旧有效。
https://stackoverflow.com/questions/4984647/accessing-dict-keys-like-an-attribute 尽管如此,我还是觉得 python 缺乏 struct 那样简单的构造数据的方法。 |
8
yushenglin 2019-06-20 12:37:31 +08:00
DRF 的序列化器了解一下
|