如何配置金字塔的JSON编码?

2024-10-01 00:22:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图返回这样一个函数:

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='json')
def returnJSON(color, message=None):
    return  json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default)

由于Pyramid自身的JSON编码,它将以如下方式进行双重编码:

^{pr2}$

我该怎么解决这个问题?{a1或Mongo的类型需要使用^或相同的类型。在


Tags: 函数nameviewconfigjsondefault类型message
3条回答

字典似乎被JSON编码了两次,相当于:

json.dumps(json.dumps({ "color" : "color", "message" : "message" }))

也许您的Python框架会自动对结果进行JSON编码?试试这个:

^{pr2}$

编辑:

要使用自定义的金字塔渲染器以您想要的方式生成JSON,请尝试以下操作(基于renderer docsrenderer sources)。在

启动时:

from pyramid.config import Configurator
from pyramid.renderers import JSON

config = Configurator()
config.add_renderer('json_with_custom_default', JSON(default=json_util.default))

然后您就有了一个“json”和“自定义”渲染器来使用:

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='json_with_custom_default')

编辑2

另一个选择是返回一个Response对象,渲染器不应该修改它。E、 g

from pyramid.response import Response
def returnJSON(color, message):
  json_string = json.dumps({"color": color, "message": message}, default=json_util.default)
  return Response(json_string)

您没有说,但是我假设您只是使用标准的json模块。在

json模块没有为JSON定义类;它使用标准Python dict作为数据的“本机”表示。json.dumps()dict编码为JSON字符串;json.loads()接受一个JSON字符串并返回一个dict。在

所以与其这样做:

def returnJSON(color, message=None):
    return  json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default)

尝试这样做:

^{pr2}$

只需传回一个普通的dict。看看你的iPhone应用程序喜欢这个。在

除了其他优秀的答案之外,我还想指出,如果您不希望视图函数返回的数据被传递json.dumps文件那么您不应该在视图配置中使用renderer=“json”。)

所以不是

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='json')
def returnJSON(color, message=None):
    return  json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default)

你可以用

^{pr2}$

string呈现程序将按原样传递函数返回的字符串数据。然而,注册一个定制的渲染器是一个更好的方法(参见@orip的答案)

相关问题 更多 >