【问题标题】:JSON response in Google App Engine with Python使用 Python 的 Google App Engine 中的 JSON 响应
【发布时间】:2015-12-12 13:41:27
【问题描述】:

我想用 Python 和 Google App Engine 构建一个 REST 服务,并拥有以下代码:

编辑代码:

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

【问题讨论】:

    标签: python json google-app-engine


    【解决方案1】:

    我现在使用 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)
    

    【讨论】:

      【解决方案2】:

      使用db.to_dict 将模型转换为字典,然后您可以对其执行json.dumps

      class GetAllItems(webapp2.RequestHandler):
          def get(self):
              item = Item(summary="Summary", dueDate="Date")
              item.put()
      
              all_items = Item.all()
              data = []
              for entry in all_items:
                  data.append(db.to_dict(entry))
      
              self.response(json.dumps(data))
      

      【讨论】:

      • 使用我的模型我现在得到这个错误:TypeError: is not JSON serializable
      • 这很奇怪。尝试调试db.to_dict(entry)的类型
      猜你喜欢
      • 1970-01-01
      • 2020-01-22
      • 2020-10-24
      • 2012-11-14
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      相关资源
      最近更新 更多