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. Spyder如何在弹出框绘图【转】

    本文转载自:https://blog.csdn.net/weixin_39231685/article/details/81028833 Spyder绘图默认出现在console面板,图片无法放大,看 ...

  2. grep 使用场景

    (1)结合find命令和管道   你的一个音乐文件夹里有多种格式的文件,而你只想找到艺术家jay的mp3文件,并且不含有任何的混合音轨 find . -name "*mp3" | ...

  3. JQuery -- Jquery 中的Ajax, Jquery解析xml文件

    1. JQuery 对 Ajax 操作进行了封装,在 jQuery 中最底层的方法时 $.ajax(), 第二层是 load(), $.get() 和 $.post(),第三层是$.getScript ...

  4. Maven到底是个啥玩意

    Maven,是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 上面是百度百科对Maven的正式介绍,如果你是Maven初学者,我估计你看完之后心中肯 ...

  5. 禁用Browser Link

    Browser Link是VS 2013开始引入的一个强大功能,让前端代码(比如AngularJS的代码)在VS中的修改更加轻而易举. 前端代码是运行在浏览器中,而Visual Studio通常只会和 ...

  6. sizeof结构体

    规则1:结构体的对折长度为其基本数据成员的长度的最大值. 规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者. 规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数 ...

  7. opencv:图像的创建和储存

    示例代码: #include <opencv.hpp> #include <vector> using namespace std; using namespace cv; v ...

  8. 大马猴队-Alpha阶段项目复审

    队名 优点 缺点 名次 菜鸡互坑队 经典游戏,情怀加分. 刷新的苹果会在蛇身上出现  14 菜鸡互啄 利用python语言实现git版本管理,典型用户清晰. 没有很好地分析用户痛点,没有测试计划  4 ...

  9. react layout init

    class Layout extends React.Component { constructor(props) { super(props); } render() { return ( < ...

  10. css3 伪类

    ::selection { 选中后的样式 } 链接 p:only-child     p的父级只有一个p标签 p:only-of-type   p的父级有一个p标签, 但还可以包含其他标签 p:fis ...