2013-09-02 36 views
5

JsonProperty, özellik veri deposuna girildiğinde otomatik olarak bir Python yapısını JSON olarak kodlar ve alındığında otomatik olarak çözer. Ancak, JSON verilerini tekrar kodlamak zorunda kalmadan bir web tarayıcısına göndermek güzel olurdu. Ham JSON verilerini almanın bir yolu var mı (kod çözmeyi engelliyor)?App Engine dönüşü JSON JsonProperty'den

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

    def get_json(self): 
     return ??? 

cevap

5

Yani ne istiyorsun "kaputun altındaki" olur bir JsonProperty BlobProperty bir alt sınıfı olduğunu ne veri deposuna kaydedilmiş ancak bunu alma üzerine deşifre değilken kodlanmış alır bir dicti ... sahip olduğunu her okuduğu zaman veri deposuna yazılır ve kodu çözülür (json.loads()) her zaman kodlanır (json.dumps()). Yalnızca bu işlevlerden birini ortadan kaldıran property subclass numaralı telefondan yapılabilir (ancak işletmenin varlık durumuna göre mülk için farklı davranışlara sahip olduğunu düşünmüyorum). Sadece "eğitim amaçlı" Diyelim ki o zaman ben bir JsonProperty kullanarak ve dicti dönecektir yeni özellik yöntemi eklemenizi öneririz kodunuzda dict faydalanmak gerekiyorsa o zaman

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

ne olacağını görelim için JSON olarak ve bunu kullanın. Eğer sadece o zaman JSON verilerini oluşturmak için dicti kullanırsanız

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

sadece BlobProperty kullanabilir ve

+1

Evet, buna benzer bir mülke veri atamadan önce json.dumps() geçmesine Şu an şu anda ne yapıyorum. JSON dizgisini bir “JsonProperty” den geri döndürecek bir “arka kapı” yöntemi (Hook yöntemi gibi) olup olmadığını merak ediyorum. ExtendedJsonProperty'yi tanıtmak için geriye doğru gitmek gibi görünüyor. –

+1

Verilerin veri deposundan alınmasından hemen sonra _from_base_type() yöntemi çağrıldığından bunun mümkün olduğunu düşünmüyorum. Bu noktadan itibaren, orijinal verilere artık erişilemiyor. – nizz

+1

İstediğim cevap bu değildi, ama bence doğru cevap. –