You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python2.7的Google Cloud Endpoints中解码messages.Message为JSON?含嵌套消息

解决Python 2.7 Google Cloud Endpoints中protorpc Message转JSON(含嵌套)的问题

首先得说清楚你遇到报错的原因:protorpc的messages.Message类在定义时有严格的约束,只允许声明字段类型(比如FloatField、MessageField)的成员,自定义方法会被识别为非法的非字段属性,所以触发了MessageDefinitionError——这是框架的设计限制,没法直接在Message类里加to_json方法。

下面给你两个可行的解决方案,都能完美处理嵌套消息的场景:

方案1:用protorpc原生JSON编码工具

protorpc自带了专门的JSON编码模块,能自动处理嵌套消息和各种字段类型,是最省心的方式:

from protorpc import messages
from protorpc.messages import json

# 保留你的消息定义
class GPSCoord(messages.Message):
    """ GPS data obj """
    latitude = messages.FloatField(1)
    longitude = messages.FloatField(2)
class Address(messages.Message):
    """ Address object """
    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)

# 创建测试实例
gps_data = GPSCoord(latitude=37.7749, longitude=-122.4194)
sample_address = Address(
    type="residential",
    name="Main St",
    number="123",
    city="San Francisco",
    zip_code=94105,
    gps_coord=gps_data
)

# 直接编码为JSON字符串
json_result = json.encode(sample_address)
print(json_result)

这个方法的优势是完全原生适配protorpc的所有字段类型,自动处理嵌套逻辑,和Endpoints框架的兼容性拉满,不用自己造轮子。

方案2:手动转字典后用标准JSON库编码

如果需要自定义输出格式(比如过滤空字段、修改字段命名风格),可以先把Message实例转成Python字典,再用标准库的json.dumps处理。这里需要写一个递归函数来处理嵌套消息:

import json
from protorpc import messages

def message_to_dict(message):
    """递归将protorpc Message转换为字典,支持嵌套消息和重复字段"""
    output = {}
    for field in message.all_fields():
        field_value = getattr(message, field.name)
        if field_value is None:
            continue  # 可选:跳过未赋值的空字段
        
        if isinstance(field, messages.MessageField):
            # 处理嵌套消息,递归转换
            output[field.name] = message_to_dict(field_value)
        elif isinstance(field, messages.RepeatedField):
            # 处理重复字段(比如列表类型的字段)
            output[field.name] = []
            for item in field_value:
                if isinstance(item, messages.Message):
                    output[field.name].append(message_to_dict(item))
                else:
                    output[field.name].append(item)
        else:
            # 普通字段直接赋值
            output[field.name] = field_value
    return output

# 使用示例
gps_data = GPSCoord(latitude=37.7749, longitude=-122.4194)
sample_address = Address(
    type="residential",
    name="Main St",
    number="123",
    city="San Francisco",
    zip_code=94105,
    gps_coord=gps_data
)

# 先转字典,再转JSON
address_dict = message_to_dict(sample_address)
json_result = json.dumps(address_dict, indent=2)
print(json_result)

这个方案灵活性更高,你可以根据需求修改message_to_dict函数,比如添加字段名映射(把下划线转为驼峰)、过滤特定字段等。

内容的提问来源于stack exchange,提问作者soussa77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:44:32