zoukankan      html  css  js  c++  java
  • 序列化 SqlAlchemy 的结果为 json 字符串

    http://my.oschina.net/gongshang/blog/395431?p=1

    在设计 RESTful 的网站时,我们总是希望 ORM 框架返回的结果是可以直接给 View 层使用的 JSON 字符串。但是 Sqlalchemy 的返回结果直接使用 json.dumps(res) 会报 TypeError 的错误。

    解决方案

    其实就像遇到 datetime 无法使用 json.dumps() 序列化的问题一样,我们需要继承一个json.JSONEncoder

    1.  
       
    2.  
      from sqlalchemy.ext.declarative import DeclarativeMeta
    3.  
      class AlchemyEncoder(json.JSONEncoder):
    4.  
      def default(self, obj):
    5.  
      if isinstance(obj.__class__, DeclarativeMeta):
    6.  
      # an SQLAlchemy class
    7.  
      fields = {}
    8.  
      for field in [x for x in dir(obj) if not x.startswith('_') and x != 'metadata']:
    9.  
      data = obj.__getattribute__(field)
    10.  
      try:
    11.  
      json.dumps(data) # this will fail on non-encodable values, like other classes
    12.  
      fields[field] = data
    13.  
      except TypeError: # 添加了对datetime的处理
    14.  
      if isinstance(data, datetime.datetime):
    15.  
      fields[field] = data.isoformat()
    16.  
      elif isinstance(data, datetime.date):
    17.  
      fields[field] = data.isoformat()
    18.  
      elif isinstance(data, datetime.timedelta):
    19.  
      fields[field] = (datetime.datetime.min + data).time().isoformat()
    20.  
      else:
    21.  
      fields[field] = None
    22.  
      # a json-encodable dict
    23.  
      return fields
    24.  
       
    25.  
      return json.JSONEncoder.default(self, obj)

    参考地址: stackoverflow ,在其基础上添加了对datatime的一个简单处理。

    调用的时候如下:

    1.  
      c = YourAlchemyClass()
    2.  
      print json.dumps(c, cls=AlchemyEncoder)
  • 相关阅读:
    数据类型之间的转换
    博客园页面美化全系列
    drf——django的缓存和信号
    PEP8规范
    drf——drf局部使用,全局使用顺序
    drf—— xadmin的使用
    drf—— Book系列连表接口
    drf—— base64加码与解码
    drf——小知识
    drf—— 响聊聊cookie session token的演变
  • 原文地址:https://www.cnblogs.com/ExMan/p/10313230.html
Copyright © 2011-2022 走看看