App Engine возвращает JSON из JsonProperty


Мне нравится, как JsonProperty автоматически кодирует структуру Python в JSON, когда свойство помещается в хранилище данных, и автоматически декодирует его при извлечении. Однако было бы неплохо отправить эти данные JSON в веб-браузер, не кодируя их снова. Есть ли способ получить необработанные данные JSON (то есть предотвратить декодирование)?

class DataForBrowser(ndb.Models)
    json = ndb.JsonProperty()

    def get_json(self):
        return ???
1 5

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 () перед назначением данных свойство