Python中json字符串的解析和转换

发布时间:2023-05-13

JSON是现代Web应用程序中使用的主要数据交换协议之一,因为它易于阅读和编写,并且与许多编程语言兼容,包括Python。本文将介绍如何在Python中使用JSON解析和转换字符串。

一、JSON简介

JSON(JavaScript Object Notation)是一种轻量级数据交换格式,它基于JavaScript语言的一个子集。JSON以键值对的形式表示数据,并使用大括号封装对象,用方括号封装数组。JSON的结构和Python中的字典和列表很像。 JSON数据类型:

  • 字符串:用双引号表示,例如:"hello world"
  • 数字:包括整数和浮点数,例如:12, 3.14
  • 布尔值:true, false
  • 空值:null
  • 对象:用大括号{}表示,例如:{"name": "Mike", "age": 20}
  • 数组:用方括号[]表示,例如:[1, 2, 3]

二、JSON字符串转Python对象

Python中有一个内置的json模块,可以将JSON字符串转换为Python对象,例如字典或列表。使用json.loads()方法将JSON字符串解析为Python对象。

import json
json_string = '{"name": "Mike", "age": 20}'
python_obj = json.loads(json_string)
print(python_obj)

输出:

{'name': 'Mike', 'age': 20}

三、Python对象转JSON字符串

同样,可以使用json.dumps()方法将Python对象转换为JSON字符串。

import json
python_obj = {'name': 'Mike', 'age': 20}
json_string = json.dumps(python_obj)
print(json_string)

输出:

{"name": "Mike", "age": 20}

四、编码和解码自定义类

当涉及到自定义类时,json模块需要特殊处理。它无法自动序列化类,但是我们可以定义类的__dict__属性,将其转化为一个可序列化的字典。

import json
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return "Name: %s, Age: %d" % (self.name, self.age)
student = Student("Mike", 20)
def encode_student(student):
    if isinstance(student, Student):
        return {"name": student.name, "age": student.age}
    return student.__dict__
json_str = json.dumps(student, default=encode_student)
print(json_str)
decoded_student = json.loads(json_str)
print(decoded_student)

输出:

{"name": "Mike", "age": 20}
{'name': 'Mike', 'age': 20}

在编码时使用default参数,指定一个函数来处理自定义类。在这里,我们将Student类转换为字典类型,其他类型则返回其__dict__属性。

五、处理JSON文件

可以使用json.load()json.dump()来读写JSON文件。

import json
# 写入JSON文件
data = {"name": "Mike", "age": 20}
with open("data.json", "w") as f:
    json.dump(data, f)
# 读取JSON文件
with open("data.json", "r") as f:
    data = json.load(f)
    print(data)

输出:

{'name': 'Mike', 'age': 20}

六、总结

本文介绍了Python中json字符串的解析和转换。我们学习了JSON的基本概念,如何将JSON字符串转换为Python对象、如何将Python对象转换为JSON字符串,如何处理自定义类,以及如何读写JSON文件。对于处理JSON数据,学习这些知识点是至关重要的。