1. dumps() 方法:将 Python 对象编码成 JSON 字符串。
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)
参数介绍:
(1)ensure_ascii 参数:默认为True, 如果被设置为False, 则可以返回non-ASCII的字符串。
json_data = json.dumps(data_dict)
print(json_data) # {"name": "\u5434\u6653\u5b87", "shares": 100, "price": 542.23}
json_data = json.dumps(data_dict, ensure_ascii=False)
print(json_data) # {"name": "吴晓宇", "shares": 100, "price": 542.23}
(2)sort_keys 参数:默认为False,如果设置为True,则输出的字典会按照key的字典序升序排列。
json_data = json.dumps(data_dict, ensure_ascii=False, sort_keys=True)
print(json_data)
2. dump() 方法:用于写文件。
with open("json_dump_test.json", "w") as f:
json.dump(data_dict, f, ensure_ascii=False)
3. loads() 方法:将已编码的 JSON 字符串解码为 Python 对象。
json_data = json.dumps(data_dict, ensure_ascii=False, sort_keys=True)
print(json_data)
print(json.loads(json_data))
4. load() 方法:对应dump()方法
with open("json_dump_test.json", "r") as f:
json_data = json.load(f)
print(json_data)
5. json.JSONEncoder 类:
json 库支持下面这些类型转化为 json 的数据类型:
Python 类型 | Json 类型 |
dict | object |
list, tuple | array |
int, float | number |
True | true |
False | false |
None | null |
如果要调用 json 库转化除了上面类型以外的其他类型,则要重载 JSONEncoder.default() 方法,让 defalut() 返回一个可序列化地对象,否则会调用默认的 default() 方法,raise 一个 TypeError 。
在 JSONEncoder 不知道怎么去把一个数据转换成 json 字符串的时候,它就会去调用 default() 函数, 所以要重写这个函数来处理它本身不支持的数据类型,不然 default() 函数默认是直接抛异常的。
例如:
def default(self, o):
try:
iterable = iter(o)
except TypeError:
pass
else:
return list(iterable)
# Let the base class default method raise the TypeError
return JSONEncoder.default(self, o)
所以 可以继承 JSONEncoder 来处理 JSONEncoder 不能处理的数据类型。
json.dumps() 会调用 encoder.encode() 方法。
class mycls(object):
def __str__(self):
return "my cls object"
myobj = mycls()
from json.encoder import JSONEncoder
class myEncoder(JSONEncoder):
def default(self, o):
try:
iterable = iter(o) # 尝试是不是可以迭代的
except TypeError:
print("Not a Iterable object")
else:
return list(iterable)
# json_data = myEncoder(ensure_ascii=False).encode(data_dict)
# print(json_data) # {"测试": "中文", "name": "吴晓宇", "shares": 100, "price": 542.23}
json_data2 = myEncoder(ensure_ascii=False).encode(myobj)
print(json_data2)