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格式 -> 数据类型,一般称为:反序列化
```python
import json
data_string = '[{"id": 1, "name": "沐风", "age": 18}, {"id": 2, "name": "deepwind", "age": 28}]'
data_list = json.loads(data_string)
print(data_list)
JSON与文件
# JSON字符串写入文件
import json
d = {
"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 None
undefined undefined (note 1)
Boolean (true,false) bool (True or False)
Integer int or long (note 2)
Float float
String str or unicode ( "..." or u"..." )
Array [a, ...] list ( [...] )
Object {a:b, ...} dict ( {...} )
其他类型如果想要支持,需要自定义JSONEncoder
才能实现【目前只需要了解大概意思即可,以后项目开发中用到了还会讲解。】,例如:
import json
from decimal import Decimal
from datetime import datetime
data = [
{"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)
# 解析规则的json
py_json2 = '{"x":1, "y":2, "z":3}'
data = json.loads(py_json2)
print(data)
# {'y': 2, 'x': 1, 'z': 3}
JSON与字符串
import demjson
js_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 demjson
js_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 demjson
import datetime
a = [1, 2, 3]
print(demjson.encode(datetime.datetime.now()))
# "2021-02-10T17:45:03.607422"