simplejson + GAE序列化具有字段名称的对象

时间:2010-12-06 12:49:12

标签: python json google-app-engine

我使用此代码在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 :(得分: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)

但是你在这里'双重编码' - 即编码对,将该字符串添加到对象并对其进行编码。如果你在另一端'双重解码'它应该工作 - 但它不是'正确'做事的方式。

答案 1 :(得分:0)

我认为我找到了一个更好的简单解决方案,而不是使用simplejson进行序列化,我只是在Pair类中创建了一个看起来像这样的方法:

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

并且我需要的一切。谢谢!