关于协议缓冲区:为什么 python protobuf json_format.Parse 会抛出 TypeError?

Why does python protobuf json_format.Parse throw a TypeError?

我正在尝试将 protobuf 序列化为 JSON。我用以下消息制作了一个简单的 proto 文件:

1
2
3
4
5
6
7
8
syntax ="proto3";
message Bool {
    bool data = 1;
}

message BoolArray {
    repeated Bool bools = 1;
}

然后我运行一些基本代码来构建消息,推送到 Json,然后将其读回:

1
2
3
4
5
6
pb_bool_array = pb_bool.BoolArray()
b = pb_bool_array.bools.add()
b.data = True
bools_as_json = MessageToJson( pb_bool_array )

Parse(bools_as_json, proto.bool_pb2.BoolArray )

但是 Parse 函数会抛出一个 TypeError 并带有以下消息:

google.protobuf.json_format.ParseError: Failed to parse bools field:
unbound method ClearField() must be called with BoolArray instance as
first argument (got str instance instead).

我跟踪了 Parse 函数,这个错误在 Google 的 json_format 代码的第 519 行触发。为什么会出现这个 TypeError?我是否在我的 proto 规范中遗漏了某些内容和/或滥用了 python API?

谢谢!


进一步分析json_format.Parse()函数后,我意识到我在滥用API。

1
Parse(bools_as_json, proto.bool_pb2.BoolArray )

应该是:

1
Parse(bools_as_json, proto.bool_pb2.BoolArray() )

API 期望填充一个消息实例,而不是消息的类型。一切都按预期工作。