3

一个人如何dict通过返回一个相似的对象protoRPC

我尝试使用FieldList无济于事。我只看到以下字段定义:

       'IntegerField',
       'FloatField',
       'BooleanField',
       'BytesField',
       'StringField',
       'MessageField',
       'EnumField',
4

4 回答 4

9

有两种情况:

1)你dict有一个明确定义的模式:这是 ProtoRPC 的最佳用例,如果可能的话,你应该尝试将它放入一个模式中。在这种情况下,您将使用MessageField与字典中的模式匹配的某个Message类。

例如,而不是

{'amount': 31, 'type': 'fish', mine: False}

你可以定义

from protorpc import messages
class MyCatch(messages.Message):
  amount = messages.IntegerField(1)
  type = messages.StringField(2)
  mine = messages.BooleanField(3)

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

messages.MessageField(MyCatch, index, ...)

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

例如:

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))

默认情况下,使用ensure_ascii是可选True的,但这可能会根据您的环境而改变。

相反,您可以使用pickle序列化您的字典。该方法pickle.dumps始终输出 ASCII/二进制,因此通过换出json.dumpspickle.dumps删除ensure_ascii=True,您将获得相同的结果。

于 2012-11-27T02:34:47.267 回答
3

可以像这样创建自定义JsonField

In  [1]: class JsonField(messages.StringField):
             type = dict

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

In  [2]: class MyMessage(messages.Message):
             data = JsonField(1)

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

In  [4]: m.data
Out [4]: {'foo': 'bar'}
于 2015-06-11T08:30:53.373 回答
2

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

于 2013-04-22T10:32:00.927 回答
0

有点涉及,但我有一个非常接近 dict 实现的方法protorpchttps ://gist.github.com/linuxluser/32d4a9c36ca0b8715ad4

它仅限于使用纯字符串键和简单(非嵌套)值。但是,如果您的数据属于该类别,则此解决方案应该可以正常工作。

这个想法有两个部分:

  1. 创建一个MultiField可以保存任意值类型的新字段类型。
  2. 创建一个类似 dict 的类型MapField,将键值对存储在MultiField类型列表中。

你像这样使用它:

import messages
import mapfield

class MyMessage(messages.Message):
  some_dict = mapfield.MapField(1)


my_message = MyMessage(some_dict={"foo": 7, "bar": False, "baz": 9.2, "qux": "nog"})

这只是一个开始。可能会更好。欢迎改进。:)

于 2015-06-11T06:18:28.847 回答