2012-05-20 3 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), хотя оно должно интерпретироваться как значение nil.

Как я могу изменить приведенный выше код, сохраняя его краткость, чтобы пропустить и не записывать свойства в словарь, который имеет значения 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 строить значения на лету.

Это не совсем кратко, но если ваша модель структуры когда-либо становится немного более сложным, вы можете захотеть взглянуть на этот рекурсивный вариант:

# 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.

Смежные вопросы