我喜欢JsonProperty
在将属性放入数据存储时如何自动将Python结构编码为JSON,并在检索时自动对其进行解码。但是,将JSON数据发送到Web浏览器而不必再次编码会很好。有没有办法获取原始JSON数据(即阻止解码)?
class DataForBrowser(ndb.Models)
json = ndb.JsonProperty()
def get_json(self):
return ???
答案 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()