【问题标题】:how do I json encode this view?我如何对这个视图进行 json 编码?
【发布时间】:2012-09-14 12:19:10
【问题描述】:

python 和 Pyramid 的新手。

我有一个分页视图。我如何对其进行 json 编码?当我尝试这个时,我得到一个错误“0x2d16d90> 的对象不是 JSON 可序列化的”:

@view_config(route_name="paginate")  
def paginate(request):
    query = DBSession.query(MyTable)
    page_url = paginate.PageURL_WebOb(request)
    customers = paginate.Page(query, 
                     page=int(request.params.get("page", 1)), 
                     items_per_page=25, 
                     url=page_url)

    if "partial" in request.params:
        # Render the partial list page
        return render_to_response("templates/my_json.jinja2",
                                  {"customers": json.dumps(customers)},
                                  request=request)
    else:
        # Render the full list page
        return render_to_response("templates/my.jinja2",
                                  {"customers": customers},
                                  request=request)

【问题讨论】:

标签: python sqlalchemy pylons pyramid


【解决方案1】:

JSON 是一种严格的文本格式。您不能只是将 SQLAlchemy 扔给编码器并期望它可以正常工作,您需要确定对象的编码是什么样的。

一种方法是让您的 SQLAlchemy 对象实现一个额外的方法,该方法返回一个简单的 Python 字典; 可以被序列化的。这意味着它只能使用字符串作为键,并且只能包含列表、元组、数字和/或字符串。

一个示例方法可以是:

def json_dump(self):
    return dict(name=self.name, phone=[p.number for p in self.phonenumbers])

这会返回一个带有namephone 键的字典,其中phone 键包含来自(纯粹是为了举例)电话号码关系的电话号码列表。

然后,您可以使用该信息创建json.dumps 可以处理的新字典列表:

if "partial" in request.params:
    customer_json_data = [c.json_dump() for c in customers]
    # Render the partial list page
    return render_to_response("templates/my_json.jinja2",
                              {"customers": json.dumps(customer_json_data)},
                              request=request)

即将推出的 Pyramid 1.4 添加了对通过 __json__ method hookjson 渲染器中序列化自定义对象的特定支持,以及对适配器为您进行转换的支持。

【讨论】:

  • 嗯。几乎可以工作,但分页数据似乎被搞砸了,因为customers.page、customers.next_page 和customers.last_page 都设置为“end”,即使还有更多页面。不过,从数据库返回的数据似乎正在做我要求的事情
  • FTR,Pyramid 1.4a1+ 允许您定义自定义对象,以便您可以使用内置的 JSON 渲染器对其进行序列化:docs.pylonsproject.org/projects/pyramid/en/1.4-branch/narr/…
  • @ChrisMcDonough:很酷,这基本上将我提倡的方法形式化为__json__ 方法+调用它们的框架支持。
【解决方案2】:

您确定要呈现一个模板来发送您的 JSON 响应吗?我过去做过类似的事情:

return HttpResponse(
        json.dumps(customers),
        status=200,
        mimetype="application/json")

仅供参考:上面是 Django 代码...我不确定 Pylons 等价物是什么,但我正在查找...

【讨论】:

  • 这也行不通。问题是 OP 正试图将一堆 SQLAlchemy 响应对象发送到 json.dumps 并且 不起作用
猜你喜欢
  • 2020-08-28
  • 2011-07-20
  • 2011-09-09
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 2018-09-02
  • 2017-05-12
相关资源
最近更新 更多