JSON(JavaScript Object Notation)是一个轻量级的数据交换格式,Python标准库json完美实现了该格式,用法类似于marshal和pickle。
>>> import json
# 序列化列表对象
# 直接查看序列化后的结果
>>> json.dumps(['a','b','c'])
'["a", "b", "c"]'
# 反序列化
>>> json.loads(_)
['a', 'b', 'c']
# 序列化字典对象
>>> json.dumps({'a':1, 'b':2, 'c':3})
'{"a": 1, "b": 2, "c": 3}'
>>> json.loads(_)
{'a': 1, 'b': 2, 'c': 3}
>>> json.dumps([1,2,3,{'4': 5, '6': 7}])
'[1, 2, 3, {"4": 5, "6": 7}]'
# 指定分隔符,可以压缩存储,注意和上面结果的区别
>>> json.dumps([1,2,3,{'4':5, '6':7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'
>>> json.loads(_)
[1, 2, 3, {'4': 5, '6': 7}]
# 序列化中文字符串
>>> json.dumps('山东烟台')
'"\\u5c71\\u4e1c\\u70df\\u53f0"'
>>> json.loads(_)
'山东烟台'
# 无法直接序列化集合对象
>>> json.dumps({1,2,3,4})
Traceback (most recent call last):
File "<pyshell#49>", line 1, in <module>
json.dumps({1,2,3,4})
File "C:\Python36\lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "C:\Python36\lib\json\encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Python36\lib\json\encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "C:\Python36\lib\json\encoder.py", line 180, in default
o.__class__.__name__)
TypeError: Object of type 'set' is not JSON serializable
# 自定义序列化编码器
>>> class setEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, set):
return list(obj)
return json.JSONEncoder.default(self, obj)
# 自定义反序列化解码器
>>> class setDecoder(json.JSONDecoder):
def decode(self, obj):
return set(json.JSONDecoder.decode(self, obj))
# 使用自定义的编码器和解码器
>>> json.dumps({1,2,3,4}, cls=setEncoder)
'[1, 2, 3, 4]'
>>> json.loads(_, cls=setDecoder)
{1, 2, 3, 4}
>>> s = '''董付国,系列图书:
《Python程序设计基础》、
《Python程序设计》(第2版)、
《Python可以这样学》
清华大学出版社'''
# 将内容序列化并写入文本文件
>>> with open('test.txt', 'w') as fp:
json.dump(s, fp)
# 读取文件内容并反序列化
>>> with open('test.txt') as fp:
print(json.load(fp))
董付国,系列图书:
《Python程序设计基础》、
《Python程序设计》(第2版)、
《Python可以这样学》
清华大学出版社