一个人如何dict
通过返回一个相似的对象protoRPC
?
我尝试使用FieldList
无济于事。我只看到以下字段定义:
'IntegerField',
'FloatField',
'BooleanField',
'BytesField',
'StringField',
'MessageField',
'EnumField',
一个人如何dict
通过返回一个相似的对象protoRPC
?
我尝试使用FieldList
无济于事。我只看到以下字段定义:
'IntegerField',
'FloatField',
'BooleanField',
'BytesField',
'StringField',
'MessageField',
'EnumField',
有两种情况:
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.dumps
并pickle.dumps
删除ensure_ascii=True
,您将获得相同的结果。
可以像这样创建自定义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'}
对于批准答案中的第一个选项,我们可以添加一个参数repeat=True,因此我们将有一个json列表作为答案。我在https://developers.google.com/appengine/docs/python/tools/protorpc/overview?hl=en#Defining_the_Response_Message检查了它
有点涉及,但我有一个非常接近 dict 实现的方法protorpc
:https ://gist.github.com/linuxluser/32d4a9c36ca0b8715ad4
它仅限于使用纯字符串键和简单(非嵌套)值。但是,如果您的数据属于该类别,则此解决方案应该可以正常工作。
这个想法有两个部分:
MultiField
可以保存任意值类型的新字段类型。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"})
这只是一个开始。可能会更好。欢迎改进。:)