GAE NDB将结构列表导入Json

时间:2014-04-05 21:14:42

标签: python json database google-app-engine app-engine-ndb

我最近从ext.db切换到新的NDB并遇到了困难。

我想将结构化列表转换为Json包,以便我可以发送到iPhone应用程序。我得到“不是JSON可序列化”的错误。我想打包,以便所有用户最喜欢的水果都转换为Json。如果用户喜欢苹果,橙子和草莓,那么在Json的favorites字段(代码下方)中应该包含所有三种水果以及相关的分数和评论。

我知道to_dict存在,以及jsonProperty,但我不知道如何适用。

以下是我所拥有的:

class FavFruits(ndb.Model):
    fruit    = ndb.StringProperty()
    score    = ndb.IntegerProperty()
    comment  = ndb.TextProperty()

 class UserProfile(ndb.Model):
    uid            = ndb.StringProperty(required=True)
    favFruits      = ndb.StructuredProperty(FavFruits, repeated=True)

 @classmethod
 def makeJsonPackage(cls, uid):
      fruitList = UserProfile.query(UserProfile.uid == uid).get()
            entry = {}
            entry["uid"]           = fruitList.uid
            entry["favorites"]     = fruitList.favFruits
            return (entry)

 # down stream of the code
 jsonData = UserProfile.makeJsonPackage(uid)
 self.response.write(json.dumps(jsonData))

这不起作用..问题在entry["favorites"] = fruitList.favFruits,因为我在将结构化列表转换为Json数据时遇到问题。

目标:发送favFruits条目的完整列表(多个水果)。我想保留structuredList,因为我想在用户请求时查询数据,比如说“apple”,这样我就可以显示水果(苹果)以及相关的分数和评论。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

基于 AppEngine Making ndb models json serializable  和document,以下代码应该有效。

  

返回包含模型属性值的dict。财产价值   对于StructuredProperty和LocalStructuredProperty是递归的   转换成字典。

@classmethod
def makeJsonPackage(cls, uid):
    fruitList = UserProfile.query(UserProfile.uid == uid).get()
    return json.dumps(fruitList.to_dict())

UPDATE1

userPorfile = UserProfile.query(UserProfile.uid == uid).get()
return json.dumps([k.to_dict() for k in userProfile.favFruits])

EXTRA:使用端点

由于您希望将AppEngine用作移动应用程序的Backend api服务器。首先检查Endpoints API,它专门用于此类用途。

https://developers.google.com/appengine/docs/java/endpoints/

基于端点,有一个名为Endpoints Proto Datastore API的Google支持包。这为ndb模型和端点提供了更直接的连接。一开始有点难,但在你知道它是如何工作之后,它非常强大并且可以节省很多时间。

http://endpoints-proto-datastore.appspot.com/

更新2:

EDIT1: 我为ndb Model编写了一个RESTFul api生成器。

# generate restful api in one line
BigDataLab = EndpointRestBuilder(GPCode).build(
    api_name="BigDataLab",
    name="bigdatalab",
    version="v1",
    description="My Little Api"
)
回复:https://github.com/Tagtoo/endpoints-proto-datastore-rest