Одиночные кавычки заменяют двойные кавычки в Google App Engine Webapp - PullRequest
3 голосов
/ 05 апреля 2011

В последнее время я активно программирую в 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()

1 Ответ

5 голосов
/ 05 апреля 2011

А теперь я просто чувствую себя тупым.

Проблема заключалась в том, что я никогда не записывал сериализованный код на экран, а сам массив данных. Таким образом, чтобы получить полностью функциональный пример из приведенного выше кода, необходимо заменить testing на serialized в self.response.out.write(testing).

TL; DR: дважды проверьте свой код и то, что вы печатаете на экране, дети.

...