当前位置: 首页 > article >正文

Python json 序列化

json 模块

JSON : 是 一种 轻量级的 数据交换格式 、独立于编程语言的 数据格式。

数据格式 简单 、清晰。 便于 网络间数据的传输。

json 序列化 基本使用方式

序列化: Python中的对象转成 JSON格式的字符串

import json

ls = [{"name": "张三", "age": 20}, {"name": "李四", "age": 22}]

jsonstr = json.dumps(ls)

print(jsonstr)
  • dumps 方法中的参数

    • skipkeys : JSON中 的键 只支持 字符串 、数字、布尔 、null 表示 ,如果 在 python 中 提供了不支持的键类型, 则 必须将 skipkeys 设置为 True
      ls = [{"name": "张三", "age": 20, (1,2): 100, None: 1}, {"name": "李四", "age": 22}]
      
      jsonstr = json.dumps(ls, skipkeys=True)
      
      print(jsonstr)
      
    • ensure_ascii : 对 ascii 之外的数据 进行 Unicode 编码 , 如果希望不进行编码,可以设置为 False
      ls = [{"name": "张三", "age": 20, (1,2): 100, None: 1}, {"name": "李四", "age": 22}]
      jsonstr = json.dumps(ls, skipkeys=True, ensure_ascii=False)
      
    • indent : 对 json 进行美化, 值是 一个 数字 、推荐使用 4
    • allow_nan : 对序列化的数据 是否 支持 非数 float(“nan”) 、 正无穷 float(“inf”) 、 负无穷 float(“-inf”)
    • default : 可以对 无法序列化的 对象 进行 特殊处理 (在序列化的时候,无法处理的类型 会触发 default 函数的调用。)
      import json
      
      
      class Person:
          def __init__(self, name, age):
              self.name = name
              self.age = age
      
      
      if __name__ == '__main__':
       
          p1 = Person(name="张三", age=20)    #  p1.__dict__ :  可以获取一个对象的 字典表示形式。
          p2 = Person(name="李四", age=21)
          p3 = Person(name="王五", age=22)
          p4 = Person(name="赵六", age=20)
          person_list = [p1, p2, p3, p4]
          # 使用 JSON 序列化 将数据 转成 JSON字符串
          json_string = json.dumps(person_list, ensure_ascii=False, default=lambda obj: obj.__dict__, indent=2)
      
          print(json_string)
      
      
    • cls : 允许定义一个类 、该类需要 继承 json.JSONEncoder ,并重写 父类 中 default 方法, 解决数据无法序列化的问题。
      from datetime import date, datetime
      
      
      class Person:
          def __init__(self, name, age, birth=None):
              self.name = name
              self.age = age
              self.birth = birth
      
      
      class JsonEncoder(json.JSONEncoder):
          def default(self, o):
              if hasattr(o, "__dict__"):
                  return o.__dict__
              if isinstance(o, date):
                  return o.strftime('%Y-%m-%d')
      
              if isinstance(o, datetime):
                  return o.strftime('%Y-%m-%d %H:%M:%S')
      
              return str(o)
      
      
      if __name__ == '__main__':
          p1 = Person(name="张三", age=20, birth=date(2000, 10, 10))
          print(p1.__dict__)
          p2 = Person(name="李四", age=21)
          p3 = Person(name="王五", age=22)
          p4 = Person(name="赵六", age=20)
          person_list = [p1, p2, p3, p4]
          # 使用 JSON 序列化 将数据 转成 JSON字符串
          json_string = json.dumps(person_list, ensure_ascii=False, cls=JsonEncoder, indent=2)
      
          print(json_string)
      
      
  • loads(string , object_hook=None)

    import json
    from datetime import date, datetime
    
    # 创建一个 json格式的字符串
    string = '[{"name": "张三", "age": 20, "birth": "1990-10-10"}, {"name": "李四", "age": 20, "birth": "1990-10-10"}]'
    
    
    class Person:
        def __init__(self, name, age, birth=None):
            self.name = name
            self.age = age
            self.birth = birth
    
        def __repr__(self):
            return str(self.__dict__)
    
    
    def test(kwargs):
        if "birth" in kwargs:
            kwargs["birth"] = datetime.strptime(kwargs["birth"], '%Y-%m-%d').date()
    
        return Person(**kwargs)
    
    
    # 将 该字符串转成列表
    ls = json.loads(string, object_hook=test)
    
    print(ls)
    

http://www.kler.cn/a/419114.html

相关文章:

  • close and shutdown?
  • 网络安全相关证书资料
  • 如何使用Python进行下载对应的视频地址
  • jdk各个版本介绍
  • pycharm链接neo4j(导入文件)
  • 2411rust,1.83
  • mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
  • Linux —— 《线程控制》
  • nmap基本用法
  • 【小白学机器学习39】如何用numpy生成总体,生成样本samples
  • 【RISC-V CPU debug 专栏 2.3 -- Run Control】
  • .NET周刊【11月第4期 2024-11-24】
  • React与Ant Design入门指南
  • springboot336社区物资交易互助平台pf(论文+源码)_kaic
  • Linux命令进阶·如何切换root以及回退、sudo命令、用户/用户组管理,以及解决创建用户不显示问题和Ubuntu不显示用户名只显示“$“符号问题
  • 桶排序(代码+注释)
  • webUI自动化(十)iframe切换
  • 【docker集群应用】Docker数据管理与镜像创建
  • Flutter:encrypt插件 AES加密处理
  • 10.请求拦截和响应拦截
  • Rust代写 OCaml代做 Go R语言 SML Haskell Prolog DrRacket Lisp
  • Jackson库--ObjecMapper
  • vue3 与 spring-boot 完成跨域访问
  • Maven java 项目,想执行verify阶段指令,通常需要配置哪些插件呢?
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-ops.py
  • Java知识及热点面试题总结(二)