Python中的JSON编码和解码函数
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,其语法规则简洁明了,易于阅读和编写。在Python中,我们可以使用内置的json模块对JSON进行编码和解码。
## JSON编码
Python的json模块提供了dumps()函数,可以将Python对象编码为JSON格式的字符串。
### 基本使用
下面是一个简单的例子,将一个Python字典编码为JSON格式的字符串:
import json
data = {'name': 'Alice', 'age': 18, 'is_student': True}
json_data = json.dumps(data)
print(json_data)
输出结果为:{"name": "Alice", "age": 18, "is_student": true}
可以看到,dumps()函数将Python字典编码为了JSON格式的字符串。
### indent参数
dumps()函数还提供了一个indent参数,用于指定每个层级缩进的空格数。这样输出的JSON字符串将更加可读。
import json
data = {'name': 'Alice', 'age': 18, 'is_student': True}
json_data = json.dumps(data, indent=2)
print(json_data)
输出结果为:
{
"name": "Alice",
"age": 18,
"is_student": true
}
### separators参数
dumps()函数还提供了一个separators参数,用于指定分隔符。可以通过指定分隔符的类型来压缩输出的JSON字符串大小。
import json
data = {'name': 'Alice', 'age': 18, 'is_student': True}
json_data = json.dumps(data, separators=(',', ':'))
print(json_data)
输出结果为:{"name":"Alice","age":18,"is_student":true}
可以看到,输出的字符串中每个键值对之间都用逗号分隔,键和值之间用冒号分隔。
### ensure_ascii参数
默认情况下,dumps()函数的输出结果中的中文字符会被转义为Unicode码。如果想要输出中文字符而不是Unicode码,可以将ensure_ascii参数设为False。
import json
data = {'你好': '世界'}
json_data = json.dumps(data, ensure_ascii=False)
print(json_data)
输出结果为:{"你好": "世界"}
### sort_keys参数
dumps()函数默认情况下输出的JSON字符串是按照键的字母顺序排序的。如果想要根据键的添加顺序来排序,可以将sort_keys设为False。
import json
data = {'name': 'Alice', 'age': 18, 'is_student': True}
json_data = json.dumps(data, sort_keys=False)
print(json_data)
输出结果为:{"name": "Alice", "age": 18, "is_student": true}
## JSON解码
Python的json模块还提供了loads()函数,可以将JSON格式的字符串解码为Python对象。
### 基本使用
下面是一个简单的例子,将JSON格式的字符串解码为Python对象:
import json
json_data = '{"name": "Alice", "age": 18, "is_student": true}'
data = json.loads(json_data)
print(data)
输出结果为:{'name': 'Alice', 'age': 18, 'is_student': True}
可以看到,loads()函数将JSON格式的字符串解码为了Python字典对象。
### object_hook参数
loads()函数还提供了一个object_hook参数,用于将JSON解码为自定义的Python对象。
import json
class Person:
def __init__(self, name, age, is_student):
self.name = name
self.age = age
self.is_student = is_student
def person_hook(json_data):
return Person(json_data['name'], json_data['age'], json_data['is_student'])
json_data = '{"name": "Alice", "age": 18, "is_student": true}'
data = json.loads(json_data, object_hook=person_hook)
print(data.name)
输出结果为:Alice
可以看到,定义了一个自定义类Person,并将JSON解码为Person对象。
### parse_float参数
解码JSON格式字符串时,浮点数会被解码为Python的float类型。但是,在某些情况下,浮点数可能不是标准的JSON格式,比如"inf"、"nan"等。这时可以使用parse_float参数来自定义解析浮点数的行为。
import json
def float_hook(data):
if data == 'inf':
return float('inf')
elif data == '-inf':
return float('-inf')
elif data == 'nan':
return float('nan')
else:
return float(data)
json_data = '{"num": "inf"}'
data = json.loads(json_data, parse_float=float_hook)
print(data['num'])
输出结果为:inf
可以看到,使用自定义的float_hook函数将JSON中的字符串"inf"解析为了Python的float类型。
总结:Python中的json模块提供了很方便的JSON编码和解码函数,我们可以通过简单的调用dumps()和loads()函数,将Python对象和JSON格式的字符串之间进行相互转换。同时,json模块提供的多种参数可以很方便地对输出的JSON数据进行个性化设置和自定义。
