首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >protoRPC:返回字典

protoRPC:返回字典
EN

Stack Overflow用户
提问于 2012-11-27 09:36:30
回答 4查看 2.2K关注 0票数 3

如何通过protoRPC返回一个类似dict的对象?

我试着使用FieldList,但没有用。我只看到以下字段定义:

代码语言:javascript
复制
       'IntegerField',
       'FloatField',
       'BooleanField',
       'BytesField',
       'StringField',
       'MessageField',
       'EnumField',
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-27 10:34:47

有两种情况:

1)您的 dict 有一个定义良好的模式:这是ProtoRPC的最佳用例,如果可能,您应该尝试将其与模式相适应。在本例中,您将使用带有一些与字典中的模式相匹配的Message类的MessageField

例如,而不是

代码语言:javascript
复制
{'amount': 31, 'type': 'fish', mine: False}

你可以定义

代码语言:javascript
复制
from protorpc import messages
class MyCatch(messages.Message):
  amount = messages.IntegerField(1)
  type = messages.StringField(2)
  mine = messages.BooleanField(3)

,然后在字段中使用此消息定义(通过

代码语言:javascript
复制
messages.MessageField(MyCatch, index, ...)

2)您的 dict 没有定义良好的模式:在这种情况下,您可以使用json将字典转储为字符串,并请求ensure_ascii=True以确保返回类型是字节(str)对象。然后,您可以只使用BytesField

例如:

代码语言:javascript
复制
import json

class MyMessage(messages.Message):
   some_dict = messages.BytesField(1)

my_dict = {'amount': 31, 'type': 'fish', mine: False}
message = MyMessage(some_dict=json.dumps(my_dict, ensure_ascii=True))

由于True是默认设置,因此使用ensure_ascii是可选的,但根据您的环境,这一点可能会有所不同。

相反,您可以使用pickle来序列化字典。方法pickle.dumps总是输出ASCII/binary,所以通过用json.dumps替换pickle.dumps并删除ensure_ascii=True,您将得到相同的结果。

票数 9
EN

Stack Overflow用户

发布于 2015-06-11 16:30:53

可以像这样创建自定义JsonField

代码语言:javascript
复制
In  [1]: class JsonField(messages.StringField):
             type = dict

然后,您可以将其用作任何其他字段:

代码语言:javascript
复制
In  [2]: class MyMessage(messages.Message):
             data = JsonField(1)

In  [3]: m = MyMessage(data={"foo": "bar"})

In  [4]: m.data
Out [4]: {'foo': 'bar'}
票数 3
EN

Stack Overflow用户

发布于 2013-04-22 18:32:01

对于认可答案中的第一个选项,我们可以添加一个参数repeated=True,因此我们将有一个json列表作为答案。我在https://developers.google.com/appengine/docs/python/tools/protorpc/overview?hl=en#Defining_the_Response_Message上查过了

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13576140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档