Python 应用引擎从JsonProperty返回JSON

Python 应用引擎从JsonProperty返回JSON,python,json,google-app-engine,app-engine-ndb,Python,Json,Google App Engine,App Engine Ndb,我喜欢JsonProperty在将属性放入数据存储时自动将Python结构编码为JSON,并在检索时自动解码。然而,将JSON数据发送到web浏览器,而无需再次编码,这将是一件好事。有没有办法获取原始JSON数据(即防止解码) 因此,您想要的是一个dict,它在保存到数据存储时进行编码,但在检索时不进行解码。。。“幕后”发生的情况是,JsonProperty是BlobProperty的一个子类,它在每次写入数据存储时被编码(json.dumps()),在每次读取时被解码(json.loads()

我喜欢
JsonProperty
在将属性放入数据存储时自动将Python结构编码为JSON,并在检索时自动解码。然而,将JSON数据发送到web浏览器,而无需再次编码,这将是一件好事。有没有办法获取原始JSON数据(即防止解码)


因此,您想要的是一个dict,它在保存到数据存储时进行编码,但在检索时不进行解码。。。“幕后”发生的情况是,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创建JSON数据,那么只需使用BlobProperty并在将数据分配给属性之前传递JSON.dumps(),是的,这与我现在正在做的类似。我想知道是否有一个“后门”方法(比如Hook方法)可以简单地从
JsonProperty
返回JSON字符串。引入
ExtendedJsonProperty
似乎是倒退了一步。我认为这是不可能的,因为从数据存储中提取数据后立即调用了_from_base_type()方法。从那时起,原始数据不再可访问。这不是我想要的答案,但我认为这是正确的答案。
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'>
@property
def json_as_json(self):
  return json.dumps(self.json)