Python3 Dictionary与JSON

JSON与Dictionary简介

  • Python3
  • PyCharm CE

JSON简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。
它是一种文本格式。它的结构主要由键值对来构成。
一个键(key)对应一个值(value)。最外围用大括号{ }包围起来。
例如

1
2
3
4
{
"firstName": "Rust",
"lastName": "Fisher"
}

大括号括起来的叫做对象结构

JSON里也可以放数组。用中括号[ ]括起来。叫做数组结构

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"desc":"这个是一个简单的例子",
"userInfo":{
"firstName":"Rust",
"lastName":"Fisher"
},
"books":[
"Python入门",
"Python进阶",
"数据分析",
"可视化"
]
}

对象结构和数组结构可以同时存在,只要满足键值对的要求即可。

最外层也可以是中括号括起来的,里面存放着多个对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[
{
"firstName": "Tom",
"lastName": "Hanks",
"movies": ["Cast Away"]
},
{
"userInfo": {
"firstName": "Rust",
"lastName": "Fisher"
},
"books": ["Python入门", "Python进阶"],
"desc": "可以直接添加一个key-value进去"
}
]

Python的Dictionary(字典)简介

Dictionary(以下简称为dict或字典)是一种键值对数据结构。
有点像Java里的Map和Set。

初始化一个dict可以直接用大括号。里面写上key和value。

1
2
3
4
5
6
7
8
9
10
def use_dict():
user_info = {'firstName': 'Rust', 'lastName': 'Fisher'}
books = ['Python入门']
books.append('Python进阶')
result = {'userInfo': user_info, 'books': books}
result['desc'] = '可以直接添加一个key-value进去'
print(result)

# 运行结果
# {'userInfo': {'firstName': 'Rust', 'lastName': 'Fisher'}, 'books': ['Python入门', 'Python进阶'], 'desc': '可以直接添加一个key-value进去'}

可以看到,dict和JSON有些类似。都是键值对,都有数组结构。
从Python语法上来看,dict操作起来也比较简单。找到确定的key后,可以直接赋值。

Dictionary 转为JSON

Python中的dict是一种键值对的数据结构。
JSON是一种轻量级的数据交换格式,它是一种文本格式
它们都是以键值对为基础。那么它们应该能相互转换。

将dict转为JSON,这里利用json包里提供的dumps方法。

dumps方法将传入的dict转换成JSON格式的文本。

引入json

1
import json

我们写出了第一个dict转JSON的方法

1
2
3
4
def to_json1(input_dict):
print('input:', input_dict)
jsonTxt = json.dumps(input_dict)
print(jsonTxt)

输出:

1
2
input: {'userInfo': {'firstName': 'Rust', 'lastName': 'Fisher'}, 'books': ['Python入门', 'Python进阶'], 'desc': '可以直接添加一个key-value进去'}
{"userInfo": {"firstName": "Rust", "lastName": "Fisher"}, "books": ["Python\u5165\u95e8", "Python\u8fdb\u9636"], "desc": "\u53ef\u4ee5\u76f4\u63a5\u6dfb\u52a0\u4e00\u4e2akey-value\u8fdb\u53bb"}

中文字符都变成了字母和数字符号。这有点出乎我们意料。

涉及到中文字符的时候,需要dumps方法里指定ensure_ascii=False

1
2
3
4
def to_json2(input_dict):
print('input:', input_dict)
jsonTxt = json.dumps(input_dict, ensure_ascii=False)
print(jsonTxt)

输出:

1
2
input: {'userInfo': {'firstName': 'Rust', 'lastName': 'Fisher'}, 'books': ['Python入门', 'Python进阶'], 'desc': '可以直接添加一个key-value进去'}
{"userInfo": {"firstName": "Rust", "lastName": "Fisher"}, "books": ["Python入门", "Python进阶"], "desc": "可以直接添加一个key-value进去"}

这样中文字符就ok了。

list转为JSON

list中存储着多个dict。可以直接把list转为JSON。

接上面的代码

1
2
3
4
5
6
7
def list_json_demo():
tom_hanks = {'firstName': 'Tom', 'lastName': 'Hanks', 'movies': ['Cast Away']}
info = use_dict()
list = [tom_hanks, info]
jsonTxt = json.dumps(list, ensure_ascii=False)
print(jsonTxt)
return jsonTxt

输出的JSON部分:

1
[{"firstName": "Tom", "lastName": "Hanks", "movies": ["Cast Away"]}, {"userInfo": {"firstName": "Rust", "lastName": "Fisher"}, "books": ["Python入门", "Python进阶"], "desc": "可以直接添加一个key-value进去"}]

读取JSON文本

json.loads方法将输入的JSON文本转为对象。

1
2
3
def json_to_dict1(jsonTxt):
obj1 = json.loads(jsonTxt)
print(obj1)

得到的对象可能是数组或者是dict。

读取JSON文件

先打开文件,用json.load方法,读取JSON内容

1
2
3
with open(json_file_path) as json_file:
json_content = json.load(json_file) # 读取出来的是dict
# ...


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!