6

我正在尝试返回这样的函数:

@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 编码,它会像这样进行双重编码:

"{\"color\": \"color\", \"message\": \"message\"}"

我怎样才能解决这个问题?我需要使用default参数(或等效参数),因为它是 Mongo 的自定义类型所必需的。

4

4 回答 4

9

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

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

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

def returnJSON(color, message=None):
  return { "color" : "color", "message" : "message" }

编辑:

要使用以您想要的方式生成 JSON 的自定义 Pyramid 渲染器,请尝试此操作(基于渲染器文档渲染器源)。

在启动时:

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_with_custom_default' 渲染器可以使用:

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

编辑 2

另一种选择可能是返回一个Response他的渲染器不应该修改的对象。例如

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)
于 2012-06-04T20:00:36.663 回答
2

除了其他出色的答案,我想指出,如果您不希望视图函数返回的数据通过 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)

你可以使用

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

string渲染器只会按原样传递函数返回的字符串数据。但是,注册自定义渲染器是一种更好的方法(请参阅@orip 的答案)

于 2012-06-05T12:09:11.367 回答
1

你没有说,但我会假设你只是使用标准json模块。

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

所以不要这样做:

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

尝试这样做:

def returnJSON(color, message=None):
    return { "color" : "color", "message" : "message" }

只是传回一个平原dict。看看你的 iPhone 应用程序如何喜欢这个。

于 2012-06-04T20:07:05.370 回答
0

您正在转储您提供的 Python 对象(字典)的字符串

json.dumps 的手册指出:

将 obj 序列化为 JSON 格式的 str。

要从字符串转换回来,您需要使用Python JSON 函数加载,该函数将字符串加载到 JSON 对象中。

但是,您似乎正在尝试做的是encodeJSON 的 python 字典。

def returnJSON(color, message=None):
    return  json.encode({ "color" : color, "message" : message })
于 2012-06-04T19:58:50.173 回答