基础篇:json模块

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": "今晚月色很美,跟你一样"}

可以注意到几点

  1. 默认会编码成字节码,从中文的转换结果直观看出
  2. 编码字典时,key的类型必须为str, int, float, bool or None
  3. 元组会转换成列表

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()
  • 文件:
    1. f = open(path)
    2. 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类型

PythonJSON
dictobject
list,tuplearray
str,unicodestring
int,long,floatnumber
Truetrue
Falsefalse
Nonenull

参考文献:https://pymotw.com/3/json/index.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值