json简介
json是什么?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。
“在JSON出现之前,大家一直用XML来传递数据。因为XML是一种纯文本格式,所以它适合在网络上交换数据。XML本身不算复杂,但是,加上DTD、XSD、XPath、XSLT等一大堆复杂的规范以后,任何正常的软件开发人员碰到XML都会感觉头大了,最后大家发现,即使你努力钻研几个月,也未必搞得清楚XML的规范。
终于,在2002年的一天,道格拉斯·克罗克福特(Douglas Crockford)同学为了拯救深陷水深火热同时又被某几个巨型软件企业长期愚弄的软件工程师,发明了JSON这种超轻量级的数据交换格式。”
json特点
json格式适合阅读,容易理解,对计算机来说处理起来也很方便。json文本格式与C家族语言(C,C++,C#,Java,JavaScript,Perl,Python以及许多其他语言)的传统变量非常的相似,它的文本语言建立在以下两种结构上:
l “名称/值”对的无序集合(以下简称键值对),在其他编程语言中,这种“名称/值”对可能称为对象、记录、结构、字典、哈希表、键表或者关联数组。
l “值”的有序列表,对应其他语言中的数组,向量,链表或者序列。
上面这些基本的数据结构,几乎所有现代语言都能支持其中一种或多种,因此json作为一种数据交换格式就理所当然了。
json格式
名称(key/name):用双引号包含的字符串。
值(value)可以是双引号包含的字符串,真假值(true,false),空(null),对象或者数组,也就是说可以是嵌套结构。
对象(object)是无序键值对的集合:以左花括弧“{”开始,右花括弧“}”结束,每个对名称(name)与值(value)之间使用“:”分隔,键值对之间使用逗号“,”分隔。
数组(array)是有序值的序列:array以左方括弧“[”开始,右方括弧“]”结束,值与值之间使用逗号“,”分隔。
字符串(string)是使用双引号包含的数个(可以是0个)连续unicode字符,使用反斜杠“”作为转义字符,类似C语言和Java中的字符串。
整数(number)除了不支持8进制和16进制,其他特性与C语言和Java语言整数相同。
Python3 JSON使用
Python内置可以处理JSON数据的包:
import json
在Python中,JSON数据表示为一个字符串
json_data = '{"name": "Bob", "languages": ["Python", "Java"]}'
json数据还可以从文件中读取,Python中的常用JSON方法如下:
| 函数 | 描述 |
|---|---|
| json.dumps() | 将Python对象编码成JSON字符串 |
| json.loads() | 将已编码的JSON字符串解码为Python对象 |
在Python中解析JSON
使用Python JSON包中的json.loads()函数可以轻松解析JSON字符串和JSON文件为Python对象。
例1:在Python中将JSON解析为dict
import json
person = '{"name": "Bob", "languages": ["English", "Fench"]}'
person_dict = json.loads(person)
# Output: {'name': 'Bob', 'languages': ['English', 'Fench']}
print( person_dict)
# Output: ['English', 'French']
print(person_dict['languages'])
person是JSON字符串,person_dict是Python dict对象。
例2:在Python中读取JSON文件并解析
假设你的如下JSON数据存放在名字为“person.json”的文件中
{
"name": "Bob",
"languages": ["English", "Fench"]
}
可以使用如下方式解析该文件中的JSON数据:
import json
with open('path_to_file/person.json') as f:
data = json.load(f)
# Output: {'name': 'Bob', 'languages': ['English', 'Fench']}
print(data)
代码中使用open()函数打开文件,使用json.load()函数解析JSON数据,将解析得到的数据放在data变量。
JSON字符串在解析到Python对象时的默认数据对应见下表
| JSON | Python |
|---|---|
| object | dict |
| array | list |
| string | unicode |
| number (int) | int, long |
| number (real) | float |
| true | True |
| false | False |
| null | None |
[^]: 关于json.load()函数的详细使用方法见https://docs.Python.org/3.7/library/json.html
[^]: 关于在Python中对文件的操作请参考[https://www.programiz.com/Python-programming/file-operation
将Python数据打包成json字符串
使用Python JSON包中的json.dumps()函数可以将Python数据打包成JSON字符串。
例3:将dict转成JSON
import json
person_dict = {
'name': 'Bob',
'age': 12,
'children': None
}
person_json = json.dumps(person_dict)
# Output: {"name": "Bob", "age": 12, "children": null}
print(person_json)
例4:将JSON数据写入文件
import json
person_dict = {
"name": "Bob",
"languages": ["English", "Fench"],
"married": True,
"age": 32
}
with open('person.txt', 'w') as json_file:
json.dump(person_dict, json_file)
上面的程序中,打开一个文件名为“person.txt”的文件,打开模式为写入“w”,如果文件不存在,就会自动新建一个。接着使用json.dump()函数将person_dict数据打包成JSON字符串,写入到打开的文件中。
程序运行后会在该代码所在目录生成person.txt文件,文件内容应该如下;
格式化输出JSON数据
为了分析JSON数据,我们可能需要以阅读友好的格式输出JSON数据。通过向json.dumps()函数传递格式控制参数indent和sort_keys可以实现该功能。
例5:格式化打印json数据
import json
person_string = '{"name": "Bob", "languages": "English", "numbers": [2, 1.6, null]}'
# Getting dictionary
person_dict = json.loads(person_string)
# Pretty Printing JSON string back
print(json.dumps(person_dict, indent = 4, sort_keys=True))
上述参数意思为:缩进4个空格,对键值对进行升序排序,运行后输出结果如下:
{
"languages": "English",
"name": "Bob",
"numbers": [
2,
1.6,
null
]
}
可以看到,输出结果多了换行和缩进,看起来整洁多了。
Python对象在打包为JSON字符串过程中默认数据对应见下表
| Python | JSON |
|---|---|
| dict | object |
| list, tuple | array |
| str | string |
| int, float, int- & float-derived Enums | number |
| True | true |
| False | false |
| None | null |
json数据样例
{
"firstName": "John",
"lastName": "Smith",
"isAlive": true,
"age": 27,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021-3100"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
},
{
"type": "mobile",
"number": "123 456-7890"
}
],
"children": [],
"spouse": null
}