1

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)
4

2 回答 2

2

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 添加了对通过方法 hookjson在渲染器中序列化自定义对象的特定支持,以及对适配器为您进行转换的支持。__json__

于 2012-09-22T06:49:05.673 回答
0

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

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

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

于 2012-09-22T06:32:10.657 回答