json模块

json模块,是python内部的一个模块,可以将python的数据格式 转换为json格式的数据,也可以将json格式的数据转换为python的数据格式。
json格式,是一个数据格式(本质上就是个字符串,常用语网络数据传输)

json模块中常用的是:

  • json.dumps,序列化生成一个字符串。
  • json.loads,反序列化生成python数据类型。
  • json.dump,将数据序列化并写入文件(不常用)
  • json.load,将JSON文件反序列化生成python数据类型。 ```python

    Python中的数据类型的格式

    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] ]’

  1. <a name="jKBjr"></a>
  2. ### json格式作用
  3. ```bash
  4. 跨语言数据传输,例如:
  5. A系统用Python开发,有列表类型和字典类型等。
  6. B系统用Java开发,有数组、map等的类型。
  7. 语言不同,基础数据类型格式都不同。
  8. 为了方便数据传输,大家约定一个格式: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}]

  1. - json格式 -> 数据类型,一般称为:反序列化
  2. ```python
  3. import json
  4. data_string = '[{"id": 1, "name": "沐风", "age": 18}, {"id": 2, "name": "deepwind", "age": 28}]'
  5. data_list = json.loads(data_string)
  6. print(data_list)

JSON与文件

  1. # JSON字符串写入文件
  2. import json
  3. d = {
  4. "name": "mufeng",
  5. "role": "police",
  6. "blood": 76,
  7. "weapon": "AK47"
  8. }
  9. f = open("game.json", "w")
  10. json.dump(d, f)
  1. # 读取JSON文件
  2. f = open("game.json", "r")
  3. d = json.load(f, encoding='utf-8')
  4. print(d)
  5. print(d['weapon'])
  6. # {u'weapon': u'AK47', u'role': u'police', u'name': u'mufeng', u'blood': 76}
  7. # AK47

类型要求

python的数据类型转换为 json 格式,对数据类型是有要求的,默认只支持:
JSON源码
数据类型:JSON与Python

  1. ---JSON--- ---Python---
  2. null None
  3. undefined undefined (note 1)
  4. Boolean (true,false) bool (True or False)
  5. Integer int or long (note 2)
  6. Float float
  7. String str or unicode ( "..." or u"..." )
  8. Array [a, ...] list ( [...] )
  9. Object {a:b, ...} dict ( {...} )

其他类型如果想要支持,需要自定义JSONEncoder才能实现【目前只需要了解大概意思即可,以后项目开发中用到了还会讲解。】,例如:

  1. import json
  2. from decimal import Decimal
  3. from datetime import datetime
  4. data = [
  5. {"id": 1, "name": "ecithy", "age": 18, 'size': Decimal("18.99"), 'ctime': datetime.now()},
  6. {"id": 2, "name": "deepwind", "age": 18, 'size': Decimal("9.99"), 'ctime': datetime.now()},
  7. ]
  8. class MyJSONEncoder(json.JSONEncoder):
  9. def default(self, o):
  10. if type(o) == Decimal:
  11. return str(o)
  12. elif type(o) == datetime:
  13. return o.strftime("%Y-%M-%d")
  14. return super().default(o)
  15. res = json.dumps(data, cls=MyJSONEncoder)
  16. print(res)
  17. # [{"id": 1, "name": "ecithy", "age": 18, "size": "18.99", "ctime": "2021-23-09"},
  18. # {"id": 2, "name": "deepwind", "age": 18, "size": "9.99", "ctime": "2021-23-09"}]

demjson模块

可以解決不正常的json格式数据,如

  • key没有引号
  • key引号为单引号
  • ……

不规则json

  1. # javascript中的对象
  2. js_json = "{x:1, y:2, z:3}"
  3. # python打印出来的字典
  4. py_json1 = "{'x':1, 'y':2, 'z':3}"
  5. # 解析不规则的json会报错
  6. # key的单引号无法解析
  7. json.loads(js_json)
  8. json.loads(py_json1)
  9. # ValueError: Expecting property name: line 1 column 2 (char 1)
  10. # 解析规则的json
  11. py_json2 = '{"x":1, "y":2, "z":3}'
  12. data = json.loads(py_json2)
  13. print(data)
  14. # {'y': 2, 'x': 1, 'z': 3}

JSON与字符串

  1. import demjson
  2. js_json = "{x:1, y:2, z:3}"
  3. py_json1 = "{'x':1, 'y':2, 'z':3}"
  4. py_json2 = '{"x":1, "y":2, "z":3}'
  5. data = demjson.decode(js_json)
  6. print(data)
  7. # {'y': 2, 'x': 1, 'z': 3}
  8. data = demjson.decode(py_json1)
  9. print(data)
  10. # {'y': 2, 'x': 1, 'z': 3}
  11. data = demjson.decode(py_json2)
  12. print(data)
  13. # {'y': 2, 'x': 1, 'z': 3}

JSON与文件

  1. import demjson
  2. js_json = "{x:1, y:2, z:3}"
  3. data = demjson.decode(js_json)
  4. print(data)
  5. # {'y': 2, 'x': 1, 'z': 3}
  6. demjson.encode_to_file("demjson.json", data)
  7. d = demjson.decode_file("demjson.json")
  8. print(d)

支持日期类型

  1. import demjson
  2. import datetime
  3. a = [1, 2, 3]
  4. print(demjson.encode(datetime.datetime.now()))
  5. # "2021-02-10T17:45:03.607422"