86 lines
1.7 KiB
Python
86 lines
1.7 KiB
Python
#!/usr/bin/env python
|
|
# -*- encoding: utf-8 -*-
|
|
"""
|
|
Topic: JSON读写
|
|
Desc :
|
|
"""
|
|
import json
|
|
from collections import OrderedDict
|
|
|
|
|
|
class JSONObject:
|
|
def __init__(self, d):
|
|
self.__dict__ = d
|
|
|
|
|
|
class Point:
|
|
def __init__(self, x, y):
|
|
self.x = x
|
|
self.y = y
|
|
|
|
|
|
def serialize_instance(obj):
|
|
d = {'__classname__': type(obj).__name__}
|
|
d.update(vars(obj))
|
|
return d
|
|
|
|
|
|
def unserialize_object(d):
|
|
clsname = d.pop('__classname__', None)
|
|
if clsname:
|
|
cls = classes[clsname]
|
|
obj = cls.__new__(cls) # Make instance without calling __init__
|
|
for key, value in d.items():
|
|
setattr(obj, key, value)
|
|
return obj
|
|
else:
|
|
return d
|
|
|
|
# Dictionary mapping names to known classes
|
|
classes = {
|
|
'Point': Point
|
|
}
|
|
|
|
|
|
def rw_json():
|
|
data = {
|
|
'name': 'ACME',
|
|
'shares': 100,
|
|
'price': 542.23
|
|
}
|
|
|
|
json_str = json.dumps(data) # str类型
|
|
data = json.loads(json_str)
|
|
|
|
# Writing JSON data
|
|
with open('data.json', 'w') as f:
|
|
json.dump(data, f)
|
|
|
|
# Reading data back
|
|
with open('data.json', 'r') as f:
|
|
data = json.load(f)
|
|
|
|
# 使用object_pairs_hook
|
|
s = '{"name": "ACME", "shares": 50, "price": 490.1}'
|
|
data = json.loads(s, object_pairs_hook=OrderedDict)
|
|
print(data)
|
|
|
|
# 解码为自定义对象
|
|
# data = json.loads(s, object_hook=JSONObject)
|
|
# print(data.name)
|
|
# print(data.shares)
|
|
|
|
print(json.dumps(data))
|
|
print(json.dumps(data, indent=4))
|
|
|
|
p = Point(2, 3)
|
|
s = json.dumps(p, default=serialize_instance)
|
|
print(s)
|
|
a = json.loads(s, object_hook=unserialize_object)
|
|
print(a)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
rw_json()
|
|
|