2010-12-06 22 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) 

下面是一個示例結果我得到:

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

一切似乎都很正常,除了一兩件事 - 我需要在響應中的字段具有類對名稱,因此不會有隻值,但相應的字段太多的名字。我怎樣才能做到這一點?

+1

爲Pair創建一個字典而不是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序列化它,我剛剛創建Pair類,看起來像這裏面的方法:

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

,並做了所有我需要的。謝謝!

相關問題