2015-12-12 58 views
0

我想建立与Python和谷歌应用程序引擎REST服务,并有下面的代码:JSON响应与Python

编辑代码:

import webapp2 
from google.appengine.ext import db 
from google.appengine.api import users 
import json 

class Item(db.Model): 

    author   = db.UserProperty(required=False) 
    summary   = db.StringProperty(required=True) 
    description  = db.StringProperty(multiline=True) 
    url    = db.StringProperty() 
    created   = db.DateTimeProperty(auto_now_add=True) 
    updated   = db.DateTimeProperty(auto_now=True) 
    dueDate   = db.StringProperty(required=True) 
    finished   = db.BooleanProperty() 

class GetAllItems(webapp2.RequestHandler): 
    def get(self): 
     item = Item(summary="Summary", dueDate="Date") 
     item.put() 

     allItems = Item.all() 
     data = [] 
     for entry in allItems: 
      data.append(db.to_dict(entry)) 

     self.response.out.write(json.dumps(entry)) 

app = webapp2.WSGIApplication(
    [ 
     ('/api/items', GetAllItems) 
     ], 
    debug=True) 

我怎样才能将所有物品将此模型转换为JSON并将其作为JSON发回? 我总是得到这个错误:

TypeError: <main.Item object at 0x0538B590> is not JSON serializable 

回答

2

我现在使用的NDB,而不是DB和下面的代码解决了我的所有问题:

import decimal 
import webapp2 
from google.appengine.ext import ndb 
import json 
from google.appengine.api import users 


class Item(ndb.Model): 
    author = ndb.UserProperty(required=False) 
    summary = ndb.StringProperty(required=True) 
    description = ndb.StringProperty() 
    url = ndb.StringProperty() 
    created = ndb.DateTimeProperty(auto_now_add=True) 
    updated = ndb.DateTimeProperty(auto_now=True) 
    updated = ndb.StringProperty() 
    dueDate = ndb.StringProperty(required=True) 
    finished = ndb.BooleanProperty() 


class DateTimeEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if hasattr(obj, 'isoformat'): 
      return obj.isoformat() 
     elif isinstance(obj, decimal.Decimal): 
      return float(obj) 
     else: 
      return json.JSONEncoder.default(self, obj) 


class GetAllItems(webapp2.RequestHandler): 
    def get(self): 
     item = Item(summary="Summary", dueDate="Date") 
     item.put() 

     text = json.dumps([i.to_dict() for i in Item.query().fetch()], cls=DateTimeEncoder) 
     self.response.out.write(text) 


app = webapp2.WSGIApplication(
    [ 
     ('/api/items', GetAllItems) 
    ], 
    debug=True) 
0

使用db.to_dict到模型转换为字典,然后你可以在上面做json.dumps

+0

随着我的模型,现在我得到这个错误:类型错误:不JSON可序列化 – ManzMoody

+0

你能告诉我你的代码吗? – masnun

+0

我在 – ManzMoody