我正在尝试返回这样的函数:
@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
argument(或等效的),因为它是Mongo自定义类型所必需的。
答案 0 :(得分:8)
字典似乎是JSON编码的两次,相当于:
json.dumps(json.dumps({ "color" : "color", "message" : "message" }))
也许你的Python框架会自动对结果进行JSON编码?试试这个:
def returnJSON(color, message=None):
return { "color" : "color", "message" : "message" }
修改强>
要使用按您希望的方式生成JSON的自定义金字塔渲染器,请尝试此操作(基于renderer docs和renderer 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_with_custom_default'渲染器:
@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)
答案 1 :(得分: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的答案)
答案 2 :(得分:1)
您没有说,但我假设您只是使用标准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)
尝试这样做:
def returnJSON(color, message=None):
return { "color" : "color", "message" : "message" }
简单地传回普通dict
。了解您的iPhone应用程序是如何喜欢这样的。
答案 3 :(得分:0)
你是你提供它的Python对象(字典)的dumping the string。
json.dumps手册指出:
将obj序列化为JSON格式的str。
要从字符串转换回来,您需要使用Python JSON function loads将字符串LOADS转换为JSON对象。
你试图做的似乎是encode
一个到JSON的python字典。
def returnJSON(color, message=None):
return json.encode({ "color" : color, "message" : message })