python序列化--JSON

序列化–JSON

  • 把变量从内存中变成可存储或传输的过程称之为序列化(pickling)
  • 如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输(个人认为是最好的~)
  • JSON表示的对象就是标准的JavaScript语言的对象

python内置的json模块可以进行python对象到JSON格式的转换.

  • 序列化 json.dumps()json.dump() 有s的是返回一个str,内容就是标准的JSON;后者可以直接把JSON写入一个file-like Object(JSON格式化流)
import json
d = dict(name='lf',age='18',score=99)
json.dumps(d)  # '{"name": "lf", "age": "18", "score": 99}'

with open('json.txt','w') as f:
    json.dump(d,f)
  • 反序列化json.loads()json.load() 与上面对应
import json
json_d = '{"name": "lf", "age": "18", "score": 99}'
dict_d = json.loads(json_d)
print(type(dict_d))   # <class 'dict'>

with open('json.txt','rb') as f:
    load_d = json.load(f)
print(load_d)
print(type(load_d))    # <class 'dict'>

JSON进阶

  • python的dict对象可以直接序列化为JSON的{}
  • python的class的实例对象 转换为 JSON对象(序列化)

    • 方式一

      import json
      
      class Student(object):
      
          def __init__(self, name, age, score):
              self.name = name
              self.age = age
              self.score = score
      
      def student2dict(std):
          return {
              'name':std.name,
              'age': std.age,
              'score':std.score
          }
      
      s = Student('Bob',20,88)
      
      print(json.dumps(s,default=student2dict))
    • 方式二(通过实例的__dict__获取实例中dict对象) 推荐

      import json
      
      class Student(object):
      
          def __init__(self, name, age, score):
              self.name = name
              self.age = age
              self.score = score
      
      s = Student('Bob',20,88)
      
      print(s.__dict__)   # {'name': 'Bob', 'age': 20, 'score': 88}
      print(type(s.__dict__))  # <class 'dict'>
      
      print(json.dumps(s,default=lambda obj:obj.__dict__))
  • JSON对象 转换为 python的class的实例对象(反序列化)
import json

class Student(object):

    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

def dict2student(d):
    """返回Student实例对象"""
    return Student(d['name'],d['age'],d['score'])

json_str = '{"name": "Bob", "age": 20, "score": 88}'
stu1 = json.loads(json_str, object_hook=dict2student)
print(stu1)   # <__main__.Student object at 0x00000165B3208668>
print(stu1.age)   # 20

扩展

  • 对中文进行JSON序列化时,json.dumps()提供了一个ensure_ascii参数将中文转为unicode,py3默认是true
obj = dict(name='小明')
s = json.dumps(obj,ensure_ascii=True)
print(s)   # '{"name": "\u5c0f\u660e"}'

ss = json.dumps(obj,ensure_ascii=False)
print(ss)  # '{"name": "小明"}'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值