【问题标题】:google cloud endpoints messages.Message to json python谷歌云端点messages.Message到json python
【发布时间】:2018-01-28 10:24:07
【问题描述】:

如何在 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 这部分需要很大的改进。

【问题讨论】:

    标签: python google-app-engine google-cloud-endpoints-v2


    【解决方案1】:

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

    from endpoints import protojson
    p = protojson.EndpointsProtoJson()
    p.decode_message(Address, '{...}')
    

    【讨论】:

      【解决方案2】:

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

      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 请求上对其进行了测试,效果很好。

      【讨论】:

        猜你喜欢
        • 2020-03-06
        • 1970-01-01
        • 1970-01-01
        • 2015-10-27
        • 2014-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多