simplejson + GAE сериализует объекты с именами полей - PullRequest
0 голосов
/ 06 декабря 2010

Я использую этот код для определения своего класса в GAE Python:

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)

Вот пример результата, который я получаю:

{"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, так что будут не только значения, но и имена соответствующих полей.Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2010

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

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

и делает все, что мне нужно.Спасибо!

0 голосов
/ 06 декабря 2010
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)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...