2013-09-02 1 views
5

속성을 데이터 저장소에 넣을 때 JsonProperty이 JSON으로 자동으로 인코딩되는 것을 좋아하고 검색 할 때 자동으로 디코딩합니다. 그러나 JSON 데이터를 다시 인코딩 할 필요없이 웹 브라우저로 보내면 좋을 것입니다. 원시 JSON 데이터를 가져 오는 (즉, 디코딩을 방지하는) 방법이 있습니까?App Engine에서 JsonProperty의 JSON을 반환합니다.

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

    def get_json(self): 
     return ??? 

답변

5

그래서 당신이 원하는 것은 "후드 아래에"일어나는 JsonProperty이 BlobProperty의 서브 클래스입니다 무엇 데이터 저장소에 저장하지만 검색에 디코딩하지 않을 때 인코딩 가져옵니다 딕셔너리를 ...해야하는 것입니다 데이터 스토어에 기록 될 때마다 (json.dumps()) 인코딩되고 읽힐 때마다 디코딩됩니다 (json.loads()). 이 기능 중 하나를 제거하는 property subclass으로 만 수행 할 수 있습니다 (그러나 엔티티가있는 상태에 따라 속성에 대해 다른 동작을하는 것이 현명하지 않다고 생각합니다). 다만 "교육 목적은"이제 당신이 그때는 JsonProperty을 사용하고 DICT를 반환하는 새 속성 메소드를 추가하는 것이 좋습니다 코드에서 DICT의 사용을해야 할 경우 다음

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으로 사용하십시오. 당신은 단지 다음 JSON 데이터를 생성하기 위해 DICT를 사용하는 경우

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

그냥 BlobProperty를 사용하고

+1

가 네, 비슷 재산에 데이터를 할당하기 전에 json.dumps() 통과 내가 지금하고있는 일. JSON 문자열을'JsonProperty'에서 간단히 반환하는 "백도어"(후크 메서드와 같은) 메서드가 있는지 궁금합니다. 'ExtendedJsonProperty'를 소개하기 위해 거꾸로가는 것 같습니다. –

+1

데이터 저장소에서 데이터를 가져온 직후 _from_base_type() 메서드가 호출되기 때문에 이것이 가능하지 않다고 생각합니다. 이 시점부터 원래 데이터에 더 이상 액세스 할 수 없습니다. – nizz

+1

그건 내가 원했던 대답이 아니지만 정답이라고 생각합니다. –