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)

序列化 SqlAlchemy 的结果为 json 字符串的更多相关文章

  1. Json序列化与反序列化(对象与Json字符串的转换)--C#

    public class JsonHelper { #region Json序列化与反序列化 /// <summary> /// 将json转化为对象 /// (需要提前构造好结构一致的M ...

  2. 序列化LinkedHashMap,有序输出Json字符串

    LinkedHashMap本身是有序的,使用JDK自带的序列化代码或者fastJson代码序列化后,字符串并非按照插入顺序输出 Map<String,String> linkedMap=n ...

  3. 极简单的方式序列化sqlalchemy结果集为JSON

    继承 json.JSONEncoder 实现一个针对sqlalchemy返回类型的处理方式. sqlalchemy的返回类型有大都有两种,一种是Model对象,一种是Query集合(只查询部分字段). ...

  4. 【Python】极简单的方式序列化sqlalchemy结果集为JSON

    继承 json.JSONEncoder 实现一个针对sqlalchemy返回类型的处理方式. sqlalchemy的返回类型有大都有两种,一种是Model对象,一种是Query集合(只查询部分字段). ...

  5. ASP.NET用SQL Server中的数据来生成JSON字符串

    原文引自:  作者: 缺水的海豚  来源: 博客园  发布时间: 2010-09-21 21:47  阅读: 6136 次  推荐: 0   原文链接   [收藏] 摘要:ExtJs用到的数据内容基本 ...

  6. C#将JSON字符串对象序列化与反序列化

    C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product& ...

  7. C# JSON字符串序列化与反序列化

    JSON与c#对象转换http://hi.baidu.com/donick/item/4d741338870c91fe97f88d33 C# JSON字符串序列化与反序列化 – http://www. ...

  8. .NET中如何使用反序列化JSON字符串/序列化泛型对象toJsonStr

    在进行 .NET Web MVC 框架开发的网站程序的时候,我们都会遇到最关键的问题,数据传输.   .NET MVC 4中的ControllerBase类建议我们用ViewBag动态数据字典形式(t ...

  9. 使用JavaScriptSerializer序列化集合、字典、数组、DataTable为JSON字符串 分类: 前端 数据格式 JSON 2014-10-30 14:08 169人阅读 评论(0) 收藏

    一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大 ...

随机推荐

  1. 基于Bootstrap的日历控件和日期选择插件

    在线演示 本地下载

  2. 会话控制Session的应用

    Session技术与Cookie相似,都是用来存储使用者的相关资料.但是最大不同之处在于Cookie是将数据存放于客户端计算机中,而Session则是将数据存放于服务器系统下. 在Web技术发展史上, ...

  3. 【I/O】File常见用法总结

    java.io.File file可能是一个文件或者文件夹. 获取目录列表(全部/过滤) import java.io.File; import java.io.FilenameFilter; imp ...

  4. maven 项目转 gradle

    打开maven 项目的根目录,CMD 执行命令:gradle init --type pom maven项目就变成了gradle项目

  5. 编写基本的 udev 规则

    来自: https://linux.cn/article-9365-1.html?utm_source=index&utm_medium=more 读者对象 理解 udev 背后的基本概念,学 ...

  6. LINUX系统运行查看

    1.查看内存使用情况 free -m 2.查看内存,cpu等使用情况排序,使用ps -aux命令 ps -aux --sort=+rss :按内存升序排列 ps -aux --sort=-rss :按 ...

  7. LeetCode—— Invert Binary Tree

    LeetCode-- Invert Binary Tree Question invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 ...

  8. 解决com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes异常

    错误截图: 解决方法: 用root进入mysql终端,执行以下命令: alter database hive character set latin1;

  9. HDU1402 A * B Problem Plus

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  10. github上十二款最著名的Android播放器开源项目

    1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...