python - 如何使类 JSON 可序列化以在 Django session 中使用

标签 python json django session serialization

我尝试在 Django session 中存储以下任意类:

class QuizInfo:
    def __init__(self):
        self.i_active_question = INVALID_PQA_ID  # integer
        self.sequence = []

反过来,QuizInfo.sequence 列表中的每一项都是 AnsweredQuestion 的实例:

class AnsweredQuestion:
    def __init__(self, i_question, i_answer):
        self.i_question = i_question
        self.i_answer = i_answer

我尝试将这样的数据结构存储在 HttpRequest.session 中,如下所示:

qi = QuizInfo()
qi.i_active_question = 5  # e.g.
qi.sequence.append(AnsweredQuestion(1, 2))  # e.g.
qi.sequence.append(AnsweredQuestion(3, 4))  # e.g.
quiz_id = 7  # e.g.
request.session['quiz_infos'] = {quiz_id : qi}

因此 request.session['quiz_infos'] 是一个包含 int 键和 QuizInfo 值的字典。

我收到以下错误:

Traceback:

File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\utils\deprecation.py" in __call__
  93.             response = self.process_response(request, response)

File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\contrib\sessions\middleware.py" in process_response
  58.                             request.session.save()

File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\contrib\sessions\backends\db.py" in save
  83.         obj = self.create_model_instance(data)

File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\contrib\sessions\backends\db.py" in create_model_instance
  70.             session_data=self.encode(data),

File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\contrib\sessions\backends\base.py" in encode
  96.         serialized = self.serializer().dumps(session_dict)

File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\core\signing.py" in dumps
  87.         return json.dumps(obj, separators=(',', ':')).encode('latin-1')

File "c:\programs\python37\Lib\json\__init__.py" in dumps
  238.         **kw).encode(obj)

File "c:\programs\python37\Lib\json\encoder.py" in encode
  199.         chunks = self.iterencode(o, _one_shot=True)

File "c:\programs\python37\Lib\json\encoder.py" in iterencode
  257.         return _iterencode(o, 0)

File "c:\programs\python37\Lib\json\encoder.py" in default
  179.         raise TypeError(f'Object of type {o.__class__.__name__} '

Exception Type: TypeError at /
Exception Value: Object of type QuizInfo is not JSON serializable

如何使数据结构JSON可序列化?

我看到了其他问题,但是,那里的答案大多建议实现一种作为参数传递的方法。但是在 Django 中哪里可以做到这一点呢?

最佳答案

使用__dict__将其更改为字典。在您的情况下,尽管您有嵌套对象,但也需要将其转换为字典。这可以在jsbueno答案here中找到。基本上你必须迭代你的对象来检查嵌套对象,像这样,

def my_dict(obj):
   if not  hasattr(obj,"__dict__"):
       return obj
   result = {}
   for key, val in obj.__dict__.items():
       if key.startswith("_"):
           continue
       element = []
       if isinstance(val, list):
           for item in val:
               element.append(my_dict(item))
       else:
           element = my_dict(val)
       result[key] = element
   return result

编辑:

然后你可以将结果转储到字符串中,如下所示,

import json

json.dumps(result)

希望这有帮助!

关于python - 如何使类 JSON 可序列化以在 Django session 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54156120/

相关文章:

python - 装饰一个类以监视属性变化

python - Django:检查对象是否最后一个链接到另一个

php - 读取和写入 SQL 数据库

c# - 无法反序列化包含 $ref 键的 JSON

python - Tensorflow 属性错误 : 'DataSet' object has no attribute 'image'

python - 根据其他列和字典创建一个新列

jquery - 为什么 jQuery.parseJSON 从 JSON 字符串中删除斜杠?

django - 如何在 user.save() 之后验证并返回访问和刷新 token

python - Django 模板 - 列表迭代

python - 项目中不同应用程序的 Django 文件上传?