2013-09-02 4 views
5

私はJsonPropertyがそのプロパティをデータストアに入れたときに自動的にPython構造体をJSONにエンコードするのが好きで、取得時に自動的にデコードします。しかし、JSONデータを再度エンコードせずにWebブラウザに送信するといいでしょう。生のJSONデータを取得する(つまり、デコードを防ぐ)方法はありますか?App EngineはJsonPropertyからJSONを返します

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

    def get_json(self): 
     return ??? 

答えて

5

だから、あなたが欲しいのは「ボンネットの下に」たまたまJsonPropertyはBlobPropertyのサブクラスであることには何のデータストアに保存されますが、それを取り出す時にデコードされない時にエンコードされます辞書を...持っていることデータストアに書き込まれるたびにコード化され(json.dumps())、読み取られるたびにデコードされます(json.loads())。 これは、これらの関数の1つを削除するproperty subclassでのみ行うことができます(ただし、エンティティの状態に応じてプロパティに対して異なる動作を持たせることは賢明ではないと思います)。ただ、「教育目的は、」あなたは、私はJsonPropertyを使用して辞書を返します。新しいプロパティ・メソッドを追加することをお勧めあなたのコード内で辞書を利用するために必要がある場合は、

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'> 

何が起こるか見てみましょうについてJSONとして使用し、それを使用します。

@property 
def json_as_json(self): 
    return json.dumps(self.json) 

あなたはJSONデータを作成するだけのdictを使用する場合は、単にプロパティ

+1

にデータを割り当てる前BlobPropertyを使用してjson.dumps(通過)はい、それはに似ています私が現在やっていること。 JSON文字列を 'JsonProperty'から返すだけの"バックドア "メソッド(Hookメソッドのような)があるかどうか疑問に思っています。 'ExtendedJsonProperty'を紹介するのは後ろに行くようです。 –

+1

データストアからデータをフェッチした直後に_from_base_type()メソッドが呼び出されたため、これは可能ではないと思います。その時点から、元のデータにはもうアクセスできません。 – nizz

+1

これは私が欲しかった答えではありませんが、正しい答えだと思います。 –

関連する問題