我有一个以下格式的 gRPC 响应:
label {
label {
key: "blablafhidsahfoia"
}
}
label {
label {
key: "asfhdkj"
weight: 0.15829162299633026
}
label {
key: "afdfafa"
weight: 0.1708715856075287
}
label {
key: "asdffd4e"
weight: 0.13820932805538177
}
label {
key: "afdffd"
weight: 0.13021881878376007
}
label {
key: "asdffd"
weight: 0.08352510631084442
}
label {
key: "dffdfdf"
weight: 0.08115953952074051
}
label {
key: "dffd"
weight: 0.11294848471879959
}
label {
key: "afdsdf"
weight: 0.0846037045121193
}
label {
key: "fasfer"
weight: 0.040171828120946884
}
}
label {
label {
key: "9fdsklj89fksd"
weight: 1.0
}
}
label {
label {
key: "random4rfsfd"
weight: 1.0
}
}
label {
label {
key: "jfkljf;sd"
}
}
我需要从每个外部标签中提取重量最大的内部标签,或者如果没有重量,则提取唯一的标签。 响应本身是不可迭代的,我无法将其转换为列表或字典。 我发现响应有一个函数
ListField()
,结果是一个列表,但只有一个元素,这是一个像这样的元组:
response.ListFields()[0]
(<google.protobuf.pyext._message.FieldDescriptor object at 0x7ff786a76520>, [label {
key: "blablafhidsahfoia"
}
, label {
key: "asfhdkj"
weight: 0.15829162299633026
}
label {
key: "afdfafa"
weight: 0.1708715856075287
}
label {
key: "asdffd4e"
weight: 0.13820932805538177
}
label {
key: "afdffd"
weight: 0.13021881878376007
}
label {
key: "asdffd"
weight: 0.08352510631084442
}
label {
key: "dffdfdf"
weight: 0.08115953952074051
}
label {
key: "dffd"
weight: 0.11294848471879959
}
label {
key: "afdsdf"
weight: 0.0846037045121193
}
label {
key: "fasfer"
weight: 0.040171828120946884
}
, label {
key: "9fdsklj89fksd"
weight: 1.0
}
, label {
key: "random4rfsfd"
weight: 1.0
}
, label {
key: "jfkljf;sd"
}
])
所以我可以将此元组中的第二个元素转换为字符串(其中包含所有数据)并进行一些字符串处理来获取值,是否有更好的方法来执行此操作?
更新:
响应类型是:类'stat_test_pb2.StatResponse'
也许 convetion jo json 对你有好处?
from google.protobuf.json_format import MessageToJson
import json
json.loads(MessageToJson(response))
from google.protobuf.json_format import MessageToDict
MessageToDict(response)
会好很多!