欢迎访问宙启技术站
智能推送

Python中的JSON编码和解码函数

发布时间:2023-05-20 06:31:00

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数据进行个性化设置和自定义。