2010-12-06 4 views
0

я использую этот код, чтобы определить свой класс в GAE Python:simplejson + GAE сериализации объектов с именами полей

class Pair(db.Model): 
    find = db.StringProperty() 
    replace = db.StringProperty() 
    rule = db.StringProperty() 
    tags = db.StringListProperty() 
    created = db.DateTimeProperty() 
    updated = db.DateTimeProperty(auto_now=True) 

Затем я использую этот код для сериализации объектов этого класса с simplejson:

class PairEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, Pair): 
      return [str(obj.created), str(obj.updated), obj.find, obj.replace, obj.tags, obj.rule] 

Наконец я использую этот код для вывода результата в качестве ответа:

pairsquery = GqlQuery("SELECT * FROM Pair") 
     pairs = pairsquery.fetch(1000) 
     pairsList = [] 
     for pair in pairs: 
      pairsList.append(json.dumps(pair, cls=PairEncoder)) 
     serialized = json.dumps({ 
            'pairs': pairsList, 
            'count': pairsquery.count() 
            }) 

     self.response.out.write(serialized) 

Вот результат выборки I получить:

{"count": 2, "pairs": ["[\"2010-12-06 12:32:48.140000\", \"2010-12-06 12:32:48.140000\", \"random string\", \"replacement\", [\"ort\", \"common\", \"movies\"], \"remove\"]", "[\"2010-12-06 12:37:07.765000\", \"2010-12-06 12:37:07.765000\", \"random string\", \"replacement\", [\"ort\", \"common\", \"movies\"], \"remove\"]"]} 

Все вроде бы хорошо, за исключением одной вещи - мне нужно поля в ответ, чтобы иметь имена из класса Pair, так что не будет только значение, но имена соответствующих полей тоже , Как я могу это сделать?

+1

Создайте dict для пары вместо json, кодирующей его. – kevpie 2010-12-06 12:54:23

ответ

0
class PairEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, Pair): 
      return {"created": str(obj.created), "updated:": str(obj.updated), "find": obj.find, "replace": obj.replace, "tags": obj.tags, "rule": obj.rule} 
     return json.JSONEncoder.default(self, obj) 

Но вы «двойное кодирование» здесь - то есть кодирующие пары, добавляя эту строку в объект и кодирование, что тоже. Если вы «удваиваете декодирование» на другом конце, он должен работать, но это не «правильный» способ сделать что-то.

+0

Я удалил эту последнюю строку, содержащую это: return json.JSONEncoder.default (self, obj). Спасибо за ответ. Я вижу, что теперь мне нужно использовать словарь вместо списка. Он работает нормально. – 2010-12-06 13:09:04

0

я предполагал, я нашел более простое решение для этого, вместо сериализации с simplejson, я просто создал метод внутри парного класса, который выглядит следующим образом:

def return_dict(self): 
     return {'find':self.find, 'replace':self.replace, 'rule':self.rule, 'tags':self.tags} 

и делает все, что мне нужно. Благодаря!

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