我最近在Google App Engine中进行了大量编码。令我惊讶的是,当使用 simplejson 模块时,代码开始突然表现得非常奇怪。虽然应用程序的一个实例将打印(使用self.response.out.write(serialized)
,其中serialized
是字典字符串)JSON格式为:
{"error": "Your user key does not exist"}
生产者将打印出JSON字典字符串:
{'error': 'Your user key does not exist'}
显然,后者是不正确的,因为它使用单引号而不是双引号。 (因此JSONLint或几乎任何JSON解析在解析时都会死掉)
最有趣的部分?使用logging.info('')
打印到控制台时,都会正确打印JSON。除了用于测试的打印代码之外,我几乎注释了生产代码中的所有内容,问题仍然存在。
发生了什么事?!在打印到屏幕上时,是否有某个魔术开关用单引号替换所有漂亮的双引号?!
添加了Stack Overflowers的娱乐内容:
下面的代码,在我的GAE实例和公共服务器上执行,也会产生带单引号的JSON,因此这是最简单的例子。
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
import simplejson as json
class MainHandler(webapp.RequestHandler):
def get(self):
testing = { "testing" : True, "why?" : 123 }
serialized = json.dumps(testing)
self.response.headers['Content-Type'] = 'application/json'
self.response.out.write(testing)
def main():
application = webapp.WSGIApplication([('/', MainHandler)],
debug=True)
util.run_wsgi_app(application)
if __name__ == '__main__':
main()
答案 0 :(得分:5)
现在我感到愚蠢。
问题是我从未将序列化代码写入屏幕,而是数据阵列本身。因此,要从上面的代码中获取完整功能的示例,必须将testing
替换为serialized
中的self.response.out.write(testing)
。
TL; DR:仔细检查您的代码以及您要打印到屏幕上的内容,孩子们。