2015-12-12 54 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