protoRPC: returning dict
google-app-engine, protorpc, python
Solution
There are two scenarios:
1) Your `dict` has a well-defined schema: This is the best use case for ProtoRPC and if possible you should try to fit it into a schema. In this case, you would use a `MessageField` with some `Message` class that matches the schema in your dictionary.
For example, instead of
{'amount': 31, 'type': 'fish', mine: False}
you could define
from protorpc import messages
class MyCatch(messages.Message):
amount = messages.IntegerField(1)
type = messages.StringField(2)
mine = messages.BooleanField(3)
and then use this message definition in a field via
messages.MessageField(MyCatch, index, ...)
2) Your `dict` does not have a well-defined schema: In this case you can use `json` to dump your dictionary to a string and request `ensure_ascii=True` to make sure the return type is a bytes (`str`) object. Then you can just use a `BytesField`.
For example:
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))
The use of `ensure_ascii` is optional as `True` is the default, but this may change depending on your environment.
Instead you could use `pickle` to serialize your dictionary. The method `pickle.dumps` always outputs ASCII/binary, so by swapping out `json.dumps` for `pickle.dumps` and dropping the `ensure_ascii=True`, you'd have the same outcome.
Problem
How does one return a `dict` like object through `protoRPC` ? I tried using the `FieldList` to no avail. I only see the following field definitions: ``` 'IntegerField', 'FloatField', 'BooleanField', 'BytesField', 'StringField', 'MessageField', 'EnumField', ```