python – App Engine从JsonProperty返回JSON
作者:互联网
我喜欢当属性放入数据存储时JsonProperty如何自动将Python结构编码为JSON,并在检索时自动对其进行解码.但是,将JSON数据发送到Web浏览器而不必再次编码会很好.有没有办法获取原始JSON数据(即阻止解码)?
class DataForBrowser(ndb.Models)
json = ndb.JsonProperty()
def get_json(self):
return ???
解决方法:
所以你想要的是有一个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()
标签:json,python,google-app-engine,app-engine-ndb 来源: https://codeday.me/bug/20190520/1141638.html