App Engine从JsonProperty返回JSON

时间:2013-09-02 15:25:22

标签: python json google-app-engine app-engine-ndb

我喜欢JsonProperty在将属性放入数据存储时如何自动将Python结构编码为JSON,并在检索时自动对其进行解码。但是,将JSON数据发送到Web浏览器而不必再次编码会很好。有没有办法获取原始JSON数据(即阻止解码)?

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

    def get_json(self):
        return ???

1 个答案:

答案 0 :(得分:5)

所以你想要的是有一个dict,当保存到数据存储区时会被编码,但在检索它时不会被解码......“幕后”会发生的事情是JsonProperty是BlobProperty的一个子类,它被编码(json) .dumps())每次写入数据存储区并在每次读取时解码(json.loads())。 这只能通过消除其中一个函数的property subclass来完成(但我不认为根据实体的状态对属性进行不同的行为是明智的)。仅仅为了“教育目的”,让我们看看将会发生什么

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)

如果您仅使用dict创建JSON数据,那么只需使用 BlobProperty 并在将数据分配给属性之前通过 json.dumps()