App Engine возвращает JSON из JsonProperty
Мне нравится, как JsonProperty
автоматически кодирует структуру Python в JSON, когда свойство помещается в хранилище данных, и автоматически декодирует его при извлечении. Однако было бы неплохо отправить эти данные JSON в веб-браузер, не кодируя их снова. Есть ли способ получить необработанные данные JSON (то есть предотвратить декодирование)?
class DataForBrowser(ndb.Models)
json = ndb.JsonProperty()
def get_json(self):
return ???
1 ответ:
Таким образом, вы хотите иметь дикт, который кодируется при сохранении в хранилище данных, но не декодируется при его извлечении... Что происходит "под капотом", что JsonProperty является подклассом BlobProperty, который будет закодирован (в формате JSON.dumps ()) каждый раз, когда он записывается в хранилище данных и декодируется (json.loads()) каждый раз, когда он читается. Это может быть сделано только с подклассом свойств , который устраняет одну из этих функций (но я не думаю, что разумно иметь разные типы поведения для собственность в соответствии с государством субъекта является). Просто для "образовательных целей" давайте посмотрим, что произойдет тогда
from google.appengine.ext import ndb import json class ExtendedJsonProperty(ndb.BlobProperty): def _to_base_type(self, value): return json.dumps(value) def _from_base_type(self, value): return value # originally return json.loads(value) class DataForBrowser(ndb.Model): json = ExtendedJsonProperty() data = {'a': 'A'} data_for_browser = DataForBrowser() data_for_browser.json = data print type(data_for_browser.json) # returns <type 'dict'> data_for_browser.put() print type(data_for_browser.json) # returns <type 'str'> data_for_browser_retrieverd = DataForBrowser.query().get() print type(data_for_browser_retrieverd.json) # returns <type 'str'>
Если вам нужно использовать dict в вашем коде, то я предлагаю использовать JsonProperty и добавить новый метод свойства, который вернет dict как JSON и использовать его.
@property def json_as_json(self): return json.dumps(self.json)
Если вы используете дикт только для создания JSON-данных, а затем просто использовать BlobProperty и пройти через в JSON.dumps () перед назначением данных свойство