2012-09-30 3 views
35

Im Moment bin ich noch tun gerade dies:Wie kann ich JSON mit der App Engine Python webapp2 richtig ausgeben?

self.response.headers['Content-Type'] = 'application/json' 
self.response.out.write('{"success": "some var", "payload": "some var"}')

Gibt es einen besseren Weg, es zu tun einige Bibliothek?

+0

http://stackoverflow.com/questions/1171584/how-can-i-parse-json-in-google-app-engine –

Antwort

57

Ja, sollten Sie die json library verwenden, die in Python 2.7 unterstützt:

import json 

self.response.headers['Content-Type'] = 'application/json' 
obj = { 
    'success': 'some var', 
    'payload': 'some var', 
} 
self.response.out.write(json.dumps(obj)) 
+2

Doh! Ich benutzte 'self.response.headers ['Content-Type:'] = 'application/json'' die ganze Zeit und zog meine strin .. Haare. Versehentlich einen Doppelpunkt dort hinzugefügt. – Jonny

12

Python selbst ein json module hat, die sicherstellen, dass Ihre JSON richtig formatiert ist, handgeschriebener JSON ist anfälliger Fehler zu bekommen .

import json 
self.response.headers['Content-Type'] = 'application/json' 
json.dump({"success":somevar,"payload":someothervar},self.response.out) 
+1

Ich könnte falsch liegen, aber ich bezweifle, dass dies tatsächlich so funktioniert. Warum würden Sie "self.response.out" als Argument an die "dump" -Funktion übergeben? – aschmid00

+12

Es funktioniert so. self.response.out ist ein Stream und dump() nimmt einen Stream als zweites Argument. (Vielleicht sind Sie verwirrt durch den Unterschied zwischen dump() und Dumps()?) –

31

webapp2 hat ein handliches Wrapper für die json-Modul: es simplejson falls vorhanden, oder die json-Modul von Python> = 2.6, falls verfügbar, und als letzten Ausweg der django.utils.simplejson Modul auf App verwenden Motor.

http://webapp2.readthedocs.io/en/latest/api/webapp2_extras/json.html

from webapp2_extras import json 

self.response.content_type = 'application/json' 
obj = { 
    'success': 'some var', 
    'payload': 'some var', 
    } 
self.response.write(json.encode(obj)) 
0
import json 
import webapp2 

def jsonify(**kwargs): 
    response = webapp2.Response(content_type="application/json") 
    json.dump(kwargs, response.out) 
    return response 

Jeder Ort, den Sie eine JSON Antwort zurückgeben möchten ...

return jsonify(arg1='val1', arg2='val2') 

oder

return jsonify({ 'arg1': 'val1', 'arg2': 'val2' }) 
3

ich in der Regel wie folgt aus:

class JsonEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, datetime): 
      return obj.isoformat() 
     elif isinstance(obj, ndb.Key): 
      return obj.urlsafe() 

     return json.JSONEncoder.default(self, obj) 

class BaseRequestHandler(webapp2.RequestHandler): 
    def json_response(self, data, status=200): 
     self.response.headers['Content-Type'] = 'application/json' 
     self.response.status_int = status 
     self.response.write(json.dumps(data, cls=JsonEncoder)) 

class APIHandler(BaseRequestHandler): 
    def get_product(self): 
     product = Product.get(id=1) 
     if product: 
      jpro = product.to_dict() 
      self.json_response(jpro) 
     else: 
      self.json_response({'msg': 'product not found'}, status=404)