JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
- 将python对象与json字符串进行相互转换。
- 该模块提供了四个函数:dumps()、loads()、dump()、load()
- 支持python的默认原生类型(str, int, float, list, tuple, dict)
1.基本转换
1.1 dumps()
格式:
data_string = json.dumps(data)
参数:
1.sort_keys: boolean 用于指定是否对转换后的数据根据key排序,默认为False
2.indent: int 用于指定输出格式,其表示缩进的位数
3.separators: tuple 用于指定元素之间,元素的key/value之间的分隔形式,默认separators=(',', ':')
4.skipkeys: boolean 用于指定是否跳过不符合非合规的元素
5.ensure_ascii: boolean 用于指定是否将对象转换成ascii码,默认为True
6 ...
import json
data = {'a': 'A', 'c': 5, 'b': (2, 4), 'd': ['d_list', 1], 'e': '今晚月色很美,跟你一样'}
# 0.original data
data_string = json.dumps(data)
print('DATA:', repr(data))
print('DATA_STRING:', data_string)
# 1.sort_keys
sort_data = json.dumps(data, sort_keys=True)
print('SORT_DATA:', sort_data)
# 2.indent
ind_data = json.dumps(data, indent=4)
print('IND_DATA:', ind_data)
# 3.separators
sep_data = json.dumps(data, separators=(',', ':'))
print('SEP_DATA:', sep_data)
# 4.skipkeys —— Json格式要求被编码的字典的key为字符串,如果是非字符串则会抛出一个TypeError,可以设置skipkeys来跳过该key
data_1 = {'a': 'A', 1: 'one', True: 'True', None: 'not', (1,): (1,)}
try:
first = json.dumps(data_1)
print('FIRST:', first)
except TypeError as err:
print('ERROR:', err)
second = json.dumps(data_1, skipkeys=True)
print('SECOND:', second)
# 5.ensure_ascii
ascii_data = json.dumps(data, ensure_ascii=False)
print('ASCII_DATA:', ascii_data)
输出结果如下
DATA: {'a': 'A', 'c': 5, 'b': (2, 4), 'd': ['d_list', 1], 'e': '今晚月色很美,跟你一样'}
DATA_STRING: {"a": "A", "c": 5, "b": [2, 4], "d": ["d_list", 1], "e": "\u4eca\u665a\u6708\u8272\u5f88\u7f8e\uff0c\u8ddf\u4f60\u4e00\u6837"}
SORT_DATA: {"a": "A", "b": [2, 4], "c": 5, "d": ["d_list", 1], "e": "\u4eca\u665a\u6708\u8272\u5f88\u7f8e\uff0c\u8ddf\u4f60\u4e00\u6837"}
IND_DATA: {
"a": "A",
"c": 5,
"b": [
2,
4
],
"d": [
"d_list",
1
],
"e": "\u4eca\u665a\u6708\u8272\u5f88\u7f8e\uff0c\u8ddf\u4f60\u4e00\u6837"
}
SEP_DATA: {"a":"A","c":5,"b":[2,4],"d":["d_list",1],"e":"\u4eca\u665a\u6708\u8272\u5f88\u7f8e\uff0c\u8ddf\u4f60\u4e00\u6837"}
ERROR: keys must be str, int, float, bool or None, not tuple
SECOND: {"a": "A", "1": "True", "null": "not"}
ASCII_DATA: {"a": "A", "c": 5, "b": [2, 4], "d": ["d_list", 1], "e": "今晚月色很美,跟你一样"}
可以注意到几点
- 默认会编码成字节码,从中文的转换结果直观看出
- 编码字典时,key的类型必须为str, int, float, bool or None
- 元组会转换成列表
1.2 loads()
格式:
data = json.loads(data_string)
其中,data_string的类型必须为str, bytes or bytearray
data_string = '{"a": "A", "b": 2}'
data_trans = json.loads(data_string)
print('DATA_TRANS:', data_trans)
结果如下
DATA_TRANS: {'a': 'A', 'b': 2}
2.与流或文件交互
- 流:f = io.StringIO()
- 文件:
- f = open(path)
- with open(path) as f
2.1 dump()
格式:
json.dump(data, f) #其中f为文件句柄
import json
import io
data = {'a': 'A', 'c': 5, 'b': (2, 4), 'd': ['d_list', 1], 'e': '今晚月色很美,跟你一样'}
# 1.流
s = io.StringIO()
json.dump(data, s)
print('transform with streaming:\n', s.getvalue())
# 2.文件
print('transform with file:')
f = open('./test.json', 'w+')
json.dump(data, f)
f.close()
f = open('./test.json', 'r')
for i in f.readlines():
print(i)
f.close()
## 建议使用with,不需要显示执行f.close()
结果如下
transform with streaming:
{"a": "A", "c": 5, "b": [2, 4], "d": ["d_list", 1], "e": "\u4eca\u665a\u6708\u8272\u5f88\u7f8e\uff0c\u8ddf\u4f60\u4e00\u6837"}
transform with file:
{"a": "A", "c": 5, "b": [2, 4], "d": ["d_list", 1], "e": "\u4eca\u665a\u6708\u8272\u5f88\u7f8e\uff0c\u8ddf\u4f60\u4e00\u6837"}
2.2 load()
格式:
data_string = json.load(f) #其中f为文件句柄
data = '{"a": "A", "c": 5, "b": [2, 4], "d": ["d_list", 1], "e": "\\u4eca\\u665a\\u6708\\u8272\\u5f88\\u7f8e\\uff0c\\u8ddf\\u4f60\\u4e00\\u6837"}'
# 1.流
s = io.StringIO(data)
data_stream = json.load(s)
print('DATA_STREAM:', data_stream)
# 2.文件
with open('./test.json', 'r') as f:
data_file = json.load(f)
print('DATA_FILE:', data_file)
结果如下
DATA_STREAM: {'a': 'A', 'c': 5, 'b': [2, 4], 'd': ['d_list', 1], 'e': '今晚月色很美,跟你一样'}
DATA_FILE: {'a': 'A', 'c': 5, 'b': [2, 4], 'd': ['d_list', 1], 'e': '今晚月色很美,跟你一样'}
后记
python类型和json类型
Python | JSON |
---|---|
dict | object |
list,tuple | array |
str,unicode | string |
int,long,float | number |
True | true |
False | false |
None | null |
参考文献:https://pymotw.com/3/json/index.html