python--如何操作JSON数据

创建一个名为 data.json 的文本文件,将下面的 json 数据写入文件中。

 1 {
 2     "name": "Felix",
 3     "age": 18,
 4     "hobby": ["运动","游戏"],
 5     "friends": [
 6         {
 7             "name": "小明"
 8         },
 9         {
10             "name": "小刚"
11         }
12     ]
13 }

python 对象转 json 字符串称为序列化,反之为反序列化。

1. json 反序列化为 python

json 模块提供了两个函数来支持 json 字符串反序列化为一个 python 对象。

  • json.loads(s)

接收一个 json 格式的字符串,反序列化一个 python 对象。如果参数 s 的格式不满足 json 格式,抛出 JSONDecodeError 异常。

1 import json
2 json_str = '{"name":"Felix","age":18}'
3 print(json_str, type(json_str))
4 load_data = json.loads(json_str)
5 print(load_data, type(load_data))

运行结果:

1 {"name":"Felix","age":18} <class 'str'>
2 {'name': 'Felix', 'age': 18} <class 'dict'>
  • json.load(fb)

有时候需要从 json 文件中加载数据,这是一个快捷方法。接收一个以读方式打开的 json 文件对象,将文件中的 json 数据反序列化为一个 python 对象。

1 import json
2 with open('felix.json','r',encoding='utf-8') as f:
3     load_data = json.load(f)
4     print(load_data, type(load_data))

运行结果:

1 {'name': 'Felix', 'age': 18, 'hobby': ['运动', '游戏'], 'friends': [{'name': '小明'}, {'name': '小刚'}]} <class 'dict'>

 

2. python 序列化为 json

与反序列化类似,序列化 json 模块也提供了两个对应的函数

  • json.dumps(obj,ensure_ascii=True,indent=None,sort_keys=False)

    将一个 python 对象序列化为一个 json 格式的字符串。

    • obj:python 对象
    • ensure_ascii: 默认为 True,输出保证将所有输入的非 ASCII 字符转义。如果 ensure_ascii 是 false,这些字符会原样输出。
    • indent:一个非负整数或者字符串,JSON 数组元素和对象成员会被美化输出为该值指定的缩进等级。如果缩进等级为零、负数或者 "",则只会添加换行符。None``(默认值)选择最紧凑的表达。使用一个正整数会让每一层缩进同样数量的空格。如果 *indent* 是一个字符串(比如 ``"\t"),那个字符串会被用于缩进每一层。
    • sort_keys:为 True(more 为 False),表示字典的输出会以键的顺序排序。
 1 import json
 2 data = {
 3 "name": "Felix",
 4     "age": 18,
 5     "hobby": ['运动','游戏'],
 6     "friends": [
 7         {
 8             "name": "小明"
 9         },
10         {
11             "name": "小刚"
12         }
13     ]
14 }
15 json_str = json.dumps(data)
16 print(json_str)
17 print(json.dumps(data,ensure_ascii=False))
18 print(json.dumps(data,ensure_ascii=False,indent=4))
19 print(json.dumps(data,ensure_ascii=False,indent=4, sort_keys=True))

运行结果:

 1 {"name": "Felix", "age": 18, "hobby": ["\u8fd0\u52a8", "\u59b9\u5b50"], "friends": [{"name": "\u5218\u5fb7\u534e"}, {"name": "\u6881\u671d\u4f1f"}]}
2 {"name": "Felix", "age": 18, "hobby": ["运动", "游戏"], "friends": [{"name": "小明"}, {"name": "小刚"}]}
3 { 4 "name": "Felix", 5 "age": 18, 6 "hobby": [ 7 "运动", 8 "游戏" 9 ], 10 "friends": [ 11 { 12 "name": "小明" 13 }, 14 { 15 "name": "小刚" 16 } 17 ] 18 }
19 { 20 "age": 18, 21 "friends": [ 22 { 23 "name": "小明" 24 }, 25 { 26 "name": "小刚" 27 } 28 ], 29 "hobby": [ 30 "运动", 31 "游戏" 32 ], 33 "name": "Felix" 34 }
  • json.dump(obj,fb,ensure_ascii=True,indent=None,sort_keys=False)

将一个 python 对象序列化为 json 数据后写入一个以 w 模式打开的文件。

  • fb: 一个以文本写打开的文件句柄

其他参数同 json.dumps()

 1 import json
 2 data = {
 3     "name": "Felix",
 4     "age": 18,
 5     "hobby": ['运动','游戏'],
 6     "friends": [
 7         {
 8             "name": "小明"
 9         },
10         {
11             "name": "小刚"
12         }
13     ]
14 }
15 with open('first.json', 'w', encoding='utf-8') as f:
16     json.dump(data,f,ensure_ascii=False,indent=4)

 

直观上,JSON 格式和 python 中的对象类似,对应表示关系如下:

JSONPYTHON
对象(object) 字典(dict)
数组(array) 列表(list)
字符串(string) 字符串(str)
整数(int) 整数(int)
实数(float) 实数(float)
true True
false False
null None
posted @ 2022-03-15 20:35  WJ-HAHA  阅读(418)  评论(0编辑  收藏  举报