0

如何在 python 2.7 中为 Google Cloud Endpoints Frameworks 将 messages.Message 解码为 JSON?特别是当我们有一些嵌套消息时。端点版本:

google-endpoints==2.4.5google-endpoints-api-management==1.3.0

from protorpc import messages

# messsage definition
class GPSCoord(messages.Message):
    """
    GPS data obj
    """
    latitude = messages.FloatField(1)
    longitude = messages.FloatField(2)


class Address(messages.Message):
    """
    Address objectt
    """
    type = messages.StringField(1)
    name = messages.StringField(2)
    number = messages.StringField(3)
    city = messages.StringField(4)
    zip_code = messages.IntegerField(5)
    gps_coord = messages.MessageField(GPSCoord, 6)

我尝试将方法“to_json”添加到消息定义中,但出现“ MessageDefinitionError:只能使用消息定义中的字段。 ”异常。

它看起来像一个基本的操作,但它并不那么容易。Python SDK 这部分需要很大的改进。

4

2 回答 2

2

您应该使用内置的 Endpoints JSON 代码。这并不准确,但类似这样:

from endpoints import protojson
p = protojson.EndpointsProtoJson()
p.decode_message(Address, '{...}')
于 2018-01-29T21:03:03.797 回答
1

我最终开发了自己的解决方案,这里是代码:

def request_to_json(request):
    """
    Take a coming request (POST) and
    get JSON.
    """
    json_dict = {}

    for field in request.all_fields():
        if field.__class__.__name__ == 'MessageField':

            data = getattr(request, field.name)

            if data:
                if data.__class__.__name__ == 'FieldList':
                    json_dict.update({
                        field.name: [request_to_json(data[i]) for i in range(len(data))]
                    })

                else:
                    json_dict.update({
                        field.name: request_to_json(data)
                    })

        else:
            json_dict.update({
                field.name: getattr(request, field.name)
            })

    return json_dict

它考虑嵌套消息字段、列表字段和原始字段。我在 POST 请求上对其进行了测试,并且效果很好。

于 2018-01-28T18:13:19.060 回答