5

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

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

    def get_json(self):
        return ???
4

1 回答 1

5

所以你想要的是有一个字典,它在保存到数据存储时被编码,但在检索它时不被解码......“幕后”发生的是 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)

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

于 2013-09-03T02:08:27.470 回答