json模块
json模块,是python内部的一个模块,可以将python的数据格式 转换为json格式的数据,也可以将json格式的数据转换为python的数据格式。
json格式,是一个数据格式(本质上就是个字符串,常用语网络数据传输)
json模块中常用的是:
json.dumps,序列化生成一个字符串。json.loads,反序列化生成python数据类型。json.dump,将数据序列化并写入文件(不常用)json.load,将JSON文件反序列化生成python数据类型。 ```pythonPython中的数据类型的格式
data = [ {“id”: 1, “name”: “ecithy”, “age”: 18}, {“id”: 2, “name”: “deepwind”, “age”: 28}, (‘mufeng’,123), ]
JSON格式
value = ‘[ {“id”: 1, “name”: “ecithy”, “age”: 18}, {“id”: 2, “name”: “deepwind”, “age”: 28}, [“mufeng”,123] ]’
<a name="jKBjr"></a>### json格式作用```bash跨语言数据传输,例如:A系统用Python开发,有列表类型和字典类型等。B系统用Java开发,有数组、map等的类型。语言不同,基础数据类型格式都不同。为了方便数据传输,大家约定一个格式:json格式,每种语言都是将自己数据类型转换为json格式,也可以将json格式的数据转换为自己的数据类型。
JSON与字符串
Python数据类型与json格式的相互转换:
- 数据类型 -> json ,一般称为:序列化 ```python import json
 
data = [ {“id”: 1, “name”: “沐风”, “age”: 18}, {“id”: 2, “name”: “deepwind”, “age”: 28}, ]
res = json.dumps(data) print(res)
[{“id”: 1, “name”: “\u6c90\u98ce”, “age”: 18}, {“id”: 2, “name”: “deepwind”, “age”: 28}]
res = json.dumps(data, ensure_ascii=False) print(res)
[{“id”: 1, “name”: “沐风”, “age”: 18}, {“id”: 2, “name”: “deepwind”, “age”: 28}]
- json格式 -> 数据类型,一般称为:反序列化```pythonimport jsondata_string = '[{"id": 1, "name": "沐风", "age": 18}, {"id": 2, "name": "deepwind", "age": 28}]'data_list = json.loads(data_string)print(data_list)
JSON与文件
# JSON字符串写入文件import jsond = {"name": "mufeng","role": "police","blood": 76,"weapon": "AK47"}f = open("game.json", "w")json.dump(d, f)
# 读取JSON文件f = open("game.json", "r")d = json.load(f, encoding='utf-8')print(d)print(d['weapon'])# {u'weapon': u'AK47', u'role': u'police', u'name': u'mufeng', u'blood': 76}# AK47
类型要求
python的数据类型转换为 json 格式,对数据类型是有要求的,默认只支持:
JSON源码
数据类型:JSON与Python
---JSON--- ---Python---null Noneundefined undefined (note 1)Boolean (true,false) bool (True or False)Integer int or long (note 2)Float floatString str or unicode ( "..." or u"..." )Array [a, ...] list ( [...] )Object {a:b, ...} dict ( {...} )
其他类型如果想要支持,需要自定义JSONEncoder才能实现【目前只需要了解大概意思即可,以后项目开发中用到了还会讲解。】,例如:
import jsonfrom decimal import Decimalfrom datetime import datetimedata = [{"id": 1, "name": "ecithy", "age": 18, 'size': Decimal("18.99"), 'ctime': datetime.now()},{"id": 2, "name": "deepwind", "age": 18, 'size': Decimal("9.99"), 'ctime': datetime.now()},]class MyJSONEncoder(json.JSONEncoder):def default(self, o):if type(o) == Decimal:return str(o)elif type(o) == datetime:return o.strftime("%Y-%M-%d")return super().default(o)res = json.dumps(data, cls=MyJSONEncoder)print(res)# [{"id": 1, "name": "ecithy", "age": 18, "size": "18.99", "ctime": "2021-23-09"},# {"id": 2, "name": "deepwind", "age": 18, "size": "9.99", "ctime": "2021-23-09"}]
demjson模块
可以解決不正常的json格式数据,如
- key没有引号
 - key引号为单引号
 - ……
 
不规则json
# javascript中的对象js_json = "{x:1, y:2, z:3}"# python打印出来的字典py_json1 = "{'x':1, 'y':2, 'z':3}"# 解析不规则的json会报错# key的单引号无法解析json.loads(js_json)json.loads(py_json1)# ValueError: Expecting property name: line 1 column 2 (char 1)# 解析规则的jsonpy_json2 = '{"x":1, "y":2, "z":3}'data = json.loads(py_json2)print(data)# {'y': 2, 'x': 1, 'z': 3}
JSON与字符串
import demjsonjs_json = "{x:1, y:2, z:3}"py_json1 = "{'x':1, 'y':2, 'z':3}"py_json2 = '{"x":1, "y":2, "z":3}'data = demjson.decode(js_json)print(data)# {'y': 2, 'x': 1, 'z': 3}data = demjson.decode(py_json1)print(data)# {'y': 2, 'x': 1, 'z': 3}data = demjson.decode(py_json2)print(data)# {'y': 2, 'x': 1, 'z': 3}
JSON与文件
import demjsonjs_json = "{x:1, y:2, z:3}"data = demjson.decode(js_json)print(data)# {'y': 2, 'x': 1, 'z': 3}demjson.encode_to_file("demjson.json", data)d = demjson.decode_file("demjson.json")print(d)
支持日期类型
import demjsonimport datetimea = [1, 2, 3]print(demjson.encode(datetime.datetime.now()))# "2021-02-10T17:45:03.607422"
