Files
python3-cookbook/cookbook/c06/p02_rw_json.py
2014-10-15 23:28:57 +08:00

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()