2012-05-20 91 views
3

我使用code found here到GAE模型轉化成JSON:轉換GAE模型轉換成JSON

def to_dict(self): 
    return dict([(p, unicode(getattr(self, p))) for p in self.properties()]) 

它工作得很好,但如果物業不具有價值,提出的默認字符串「無」,這在我的客戶端設備(Objective-C)中被解釋爲一個真正的值,儘管它應該被解釋爲一個零值。

如何修改上面的代碼,同時保持其簡潔以避免將屬性寫入具有None值的字典?

回答

7
def to_dict(self): 
    return dict((p, unicode(getattr(self, p))) for p in self.properties() 
       if getattr(self, p) is not None) 

你並不需要首先創建一個列表(周圍[]),您可以只使用一個generator expression的基礎上即時值。

這不是很簡單的,但如果你的模型結構不斷得到一個稍微複雜一些,你可能想看看這個遞歸variant:

# Define 'simple' types 
SIMPLE_TYPES = (int, long, float, bool, dict, basestring, list) 

def to_dict(model): 
    output = {} 

    for key, prop in model.properties().iteritems(): 
     value = getattr(model, key) 

     if isinstance(value, SIMPLE_TYPES) and value is not None: 
      output[key] = value 
     elif isinstance(value, datetime.date): 
      # Convert date/datetime to ms-since-epoch ("new Date()"). 
      ms = time.mktime(value.utctimetuple()) 
      ms += getattr(value, 'microseconds', 0)/1000 
      output[key] = int(ms) 
     elif isinstance(value, db.GeoPt): 
      output[key] = {'lat': value.lat, 'lon': value.lon} 
     elif isinstance(value, db.Model): 
      # Recurse 
      output[key] = to_dict(value) 
     else: 
      raise ValueError('cannot encode ' + repr(prop)) 

    return output 

這可能與其他非簡單類型被很容易地擴展添加到elif分支。