开发者

simplejson + GAE serialize objects with fields names

I use this code to define my class in 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)

Then I use this code to serialize objects of that class with 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]

Finally I use this code to output the result as the response:

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

        self.response.out.write(serialized)

Here is a sample result I get:

{"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\"]"]}

All seems to be fine, except one thing - I need the fields in the response to have names from the class Pair, so there won't be just values but the names of the corresponding fields too. How can I do that?


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)

But you are 'double encoding' here - i.e. encoding the pairs, adding that string to an object and encoding that too. If you 'double decode' on the other end it should work - but it's not the 'proper' way to do things.


I supposed I found a better simple solution for this, instead of serializing it with simplejson, I just created a method inside Pair class that looks like this:

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

and does all I need. Thanks!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜