JSON的序列化和反序列化

一、什么是JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简单、易读、易写而被广泛采用。它通过键值对和数组的方式表示数据,能够高效地在前后端之间传输数据,并且大多数编程语言都支持 JSON 格式。JSON 主要用于前后端数据交换、配置文件存储和 API 设计等场景,使得数据处理变得直观和一致。

二、序列化

序列化就是将对象转换为JSON格式的字符串。在python中可以直接导入JSON模块使用,这里以python为例

import json

class Person:
    def __init__(self, name, age,gender):
        self.name = name
        self.age = age
        self.gender = gender
    
    def __str__(self) -> str:
        return f"Person(name = {self.name},age = {self.age},gender = {self.gender})"
    
    def test(self):
        print("My name is ",self.name)

if __name__ == "__main__":
    p = Person("张三", 20,"男")
    json_string = json.dumps(p.__dict__,ensure_ascii=False)
    print(json_string)
 #输出结果为{"name": "张三", "age": 20, "gender": "男"}

可以看到将python中的一个对象转为了JSON字符串,但是由于JSON默认采用的编码为ASCII,所以在出现中文时,可能会出现一段类似于"\u5f20\u4e09"的字符串,但是这并不影响,因为反序列化时,也使用ASCII,一人会被正确显示。如果觉得影响,可以禁用ASCII使用UTF-8,这样就可以正常显示中文。

在Python中通过函数dumps将python对象转换为JSON字符串。

序列化的底层原理就是数据类型检查与处理、递归处理复杂数据结构。

首先识别数据的类型,例如字典、列表、字符串、数字、布尔值等。将其转换为JSON中对应的对象。例如字典和列表会被转换为对应的 JSON 对象和 JSON 数组。如果遇到数据嵌套,会不断向下递归。如果遇到无法处理的数据类型,会调用默认的default()方法进行处理。再通过指定编码为字符串返回。

二、反序列化

import json

class Person:
    def __init__(self, name, age,gender):
        self.name = name
        self.age = age
        self.gender = gender
    
    def __str__(self) -> str:
        return f"Person(name = {self.name},age = {self.age},gender = {self.gender})"
    
    def test(self):
        print("My name is ",self.name)

if __name__ == "__main__":
    p = Person("张三", 20,"男")
    json_string = json.dumps(p.__dict__,ensure_ascii=False)
    
    object_dict = json.loads(json_string)
    p1 = Person(**object_dict)
    p1.test()
#输出My name is  张三 

注意这里的反序列化返回的是一个字典对象,而不是Person对象。

四、自定义序列化

import json

class PersonEncoder(json.JSONEncoder):
    def default(self, obj):
        '''自定义序列化器'''
        if isinstance(obj, Person):
            return obj.__dict__
        return super().default(obj)

class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
    
    def __str__(self) -> str:
        return f"Person(name={self.name}, age={self.age}, gender={self.gender})"
    
    def test(self):
        print("My name is", self.name)

def person_decoder(obj):
    '''自定义解码器'''
    try:
        return Person(**obj)
    except TypeError as e:
        raise TypeError(f"类型 {type(obj)} 无法被正确解码: {e}")
    
    
if __name__ == "__main__":
    p = Person("张三", 20, "男")
    json_string = json.dumps(p, cls=PersonEncoder, ensure_ascii=False)
    print(json_string)
    
    person_obj = json.loads(json_string, object_hook=person_decoder)
    person_obj.test()

自定义序列化器通过继承 json.JSONEncoder 类并重写 default 方法,来实现对特定对象类型的定制化 JSON 序列化。default 方法接收一个对象作为参数,并将该对象转换为可序列化的基本数据类型(如字典、列表、字符串等)。如果 default 方法遇到不支持的类型,可以调用父类的 default 方法以处理其他情况。通过这种方式,自定义序列化器可以将复杂的用户定义对象转换为 JSON 字符串,从而满足特定的序列化需求。

五、总结

JSON广泛应用于现代软件开发中,尤其是在前后端数据交互和配置文件处理方面。其主要特点包括易于阅读和编写、格式简洁且结构明确。JSON 支持基本数据类型,如字符串、数字、布尔值、数组、对象和 null,使得它能够灵活地表示复杂的数据结构。由于 JSON 是纯文本格式,它能够与多种编程语言和平台兼容,并且被绝大多数开发环境和框架所支持。

JSON 常用于 Web 开发中,作为客户端与服务器之间的数据传输格式,便于实现动态网页和响应式设计。在 Web API 中,JSON 作为标准的数据返回格式,使得不同系统和应用程序能够高效地交换信息。此外,JSON 还被广泛用作应用程序的配置文件格式(如 package.jsontsconfig.json),因其易于编辑和解析。JSON 的广泛应用和标准化支持,使其成为现代开发中的重要工具,大大简化了数据交换和处理过程,提高了开发效率和系统的互操作性。

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值