2010-12-06 7 views
0

j'utiliser ce code pour définir ma classe en GAE Python:simplejson + GAE sérialisent objets avec des champs noms

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) 

Puis-je utiliser ce code pour sérialiser objets de cette classe avec 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] 

Enfin, j'utiliser ce code pour produire le résultat que la réponse:

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) 

Voici un exemple de résultat I obtenir:

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

Tout semble être bien, sauf une chose - je besoin des champs dans la réponse à des noms de la classe paire, donc il n'y aura pas seulement des valeurs, mais les noms des champs correspondants aussi . Comment puis je faire ça?

+1

Créez un dict pour la paire au lieu de le coder json. – kevpie

Répondre

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) 

Mais vous êtes « double encodage » ici - à savoir coder les paires, en ajoutant cette chaîne à un objet et un codage aussi. Si vous doublez le décodage à l'autre extrémité, cela devrait fonctionner - mais ce n'est pas la bonne façon de faire les choses.

+0

J'ai enlevé cette dernière chaîne contenant ceci: return json.JSONEncoder.default (self, obj). Merci d'avoir répondu. Je vois que je dois utiliser un dictionnaire au lieu d'une liste maintenant. Ça fonctionne bien. –

0

Je croyais que je trouve une meilleure solution simple pour cela, au lieu de sérialisation avec simplejson, Je viens de créer une méthode dans la classe paire qui ressemble à ceci:

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

et fait tout ce qu'il faut. Merci!

Questions connexes