json.dumps()可以把任意python对象encode成json字符串
json.dumps()的签名
json.dumps(obj, *,
skipkeys=False,
ensure_ascii=True,
check_circular=True,
allow_nan=True,
cls=None,
indent=None,
separators=None,
default=None,
sort_keys=False,
**kw
)
用法示例
import json
# dump list
data = ['foo', {'bar': ('baz', None, 1.0, 2)}]
json.dumps(data)
# output: '["foo", {"bar": ["baz", null, 1.0, 2]}]'
# dump str
obj = "hello, world!"
json.dumps(obj)
# output: '"hello, world!"'
# dump dict
data = {"c": 0, "b": 0, "a": 0}
json.dumps(data)
# output: '{"a": 0, "c": 0, "b": 0}'
# dump dict with sort
data = {"c": 0, "b": 0, "a": 0}
json.dumps(data, sort_keys=True)
# output: '{"a": 0, "b": 0, "c": 0}'
# dump dict with pretty print(打印的更好看些)
data = {"c": 0, "b": 0, "a": 0}
json.dumps(data, sort_keys=True, indent=4)
# output: '{n "a": 0, n "b": 0, n "c": 0n}'
Python与JSON的类型对应
skipkeys
默认为False
则当被转换的对象是dict时,如果dict的过key不为Python基础类型(str, int, float, bool, None)时:
- True:跳过
- False:报TypeError错误
ensure_ascii
- 默认为True:所以非ASCII字符会被转义
- 否则维持原样
常见应用是关于中文字符输出的问题,输出真正的中文需要指定ensure_ascii=False
print(json.dumps('中国'))
# "u4e2du56fd"
print(json.dumps('中国', ensure_ascii=False))
# "中国"
check_circular
暂时不明白,先把官方文档说明贴出来,弄懂了再说
- 默认值True:
- the circular reference check for container types will be skipped and a circular reference will result in an OverflowError (or worse).
allow_nan
暂时不明白,先把官方文档说明贴出来,弄懂了再说
- 默认值True: their JavaScript equivalents (NaN, Infinity, -Infinity) will be used.
- 若为False: it will be a ValueError to serialize out of range float values (nan, inf, -inf) in strict compliance of the JSON specification.
cls
- 默认使用JSONEncoder
- 可指定自定义解析器(详情再叙)
indent
- 当值为非负整数或str时:JSON array和object(对应python中的list、tuple和dict),会按照indent层级进行缩进,让我们更好地看清结构
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print(json.dumps(data, sort_keys=True, indent=2))
输出:
[
{
"a": "A",
"b": [
2,
4
],
"c": 3.0
}
- 默认值(None) 输出紧凑的表达形式(还有更紧凑的形式,见seperators)
data = ['foo', {'bar': ('baz', None, 1.0, 2)}]
json.dumps(data)
# output: '["foo", {"bar": ["baz", null, 1.0, 2]}]'
- 0, 负数或"":只会增加新行,而不进行缩进
- 正整数:定义缩进数量(空格),下一级缩进会翻倍
- str(如"t",制表符):该字符用来对每一级进行缩进
separators
提供分隔符,可以除去空白字符,使得输出更紧凑,数据更小
值的形式为tuple:(item_separator, key_separator),分别对应item的分隔符和key的分隔符
- 当indent=None时, 默认值(', ', ': ')——注意逗号和分号后有一个空格
- 否则默认(',', ': ')——注意逗号和分号后的空格没有了
为了最紧凑的数据,减少网络传输数据量,请使用(',', ': ')减少空白字符
default
暂时不明白,先把官方文档说明贴出来,弄懂了再说
If specified, default should be a function that gets called for objects that can’t otherwise be serialized. It should return a JSON encodable version of the object or raise a TypeError. If not specified, TypeError is raised.
sort_keys
- 默认值False
· 当设置为True时,dict的输出会按key排序(按照字典排序a-z输出)