我最近从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”,这样我就可以显示水果(苹果)以及相关的分数和评论。
非常感谢任何帮助。
答案 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())
userPorfile = UserProfile.query(UserProfile.uid == uid).get()
return json.dumps([k.to_dict() for k in userProfile.favFruits])
由于您希望将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/
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