将python对象序列化为Json

时间:2019-04-07 20:31:33

标签: python

我正在努力将类序列化为json文件。

我尝试了两种方法,一种创建目录,第二种使用json。

authorized_user = Login('1','test', 'test2')
vars(authorized_user)
jsons.dumps(authorized_user)

他们都还给了我

{'_Login__request_type': '1', '_Login__username': 'test', '_Login__password': 'test2'}

如何删除登录前缀?

还有什么我想问一下是否有一种方法可以将对象序列化为具有更多json命名约定的json。就像在python命名约定中写python类字段一样:__username,但是解析器会知道它是用户名。

1 个答案:

答案 0 :(得分:1)

要修改将类编码为JSON格式/取消 Login 前缀的方式,可以为json.dumps()使用两个不同的参数之一:

  1. 扩展JSONEncoder(推荐)

要使用自定义JSONEncoder子类(例如,覆盖子类的子类 default()方法来序列化其他类型),请使用 cls kwarg;否则使用JSONEncoder

class ComplexEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Login):
            return {"request_type": obj.request_type, "username": obj.username, "password": obj.password}

json.dumps(authorized_user, cls=ComplexEncoder)
# {"request_type": "1", "username": "test", "password": "test2"}
  1. 默认参数

如果已指定,则 default 应该是为无法序列化的对象调用的函数。它应该返回该对象的JSON可编码版本或引发TypeError。如果未指定,将引发TypeError

def new_encoder(obj):
    if isinstance(obj, Login):
        return {"request_type": obj.request_type, "username": obj.username, "password": obj.password}

json.dumps(authorized_user, default=new_encoder)
# {"request_type": "1", "username": "test", "password": "test2"}

参考:https://docs.python.org/3/library/json.html