JsonFormat.parser().merge(json_string, builder);
我知道我可以使用上面的代码将json字符串转换为Protobuf-java对象。但是,如果我的json_string有多个项(列表(,并且我想把它变成list OF Protobuf java对象,该怎么办?
例如,我的json字符串是:
[
{"id": 1},
{"id": 2},
{"id": 3}
]
如何将其转换为一个包含java中的3个Protobuf对象的列表?
我不认为这是一个这样的功能,因为JsonFormat是专门为匹配规范的proto3JSON映射而设计的,它没有任何概念"顶级";数组,仅用于表示重复字段的数组。
也就是说,可能奏效(尽管令人讨厌的不雅(的变通方法至少包括:
使用具有重复字段的包装消息
如果您定义了一个包装消息,它只包含一个包含实际有效负载消息的重复字段:
message Item {
int64 id = 1;
}
message ItemList {
repeated Item items = 1;
}
您可以将JSON数组解析为一个列表,方法是用必要的位包围它,使其成为包装消息的有效实例:
ItemList.Builder builder = ItemList.newBuilder();
JsonFormat.parser().merge("{"items":" + json_string + "}", builder);
List<Item> items = builder.getItemsList();
使用采用java.io.Reader
的merge
方法的重载,您可能可以在不实际连接任何字符串的情况下实现这一点(以防它是一个非常大的消息,这很重要(,尽管它需要类似于SequenceReader的东西,而标准库中不存在SequenceReader。
使用单独的JSON库
API将取决于你选择其中的哪一个,但有很多机会他们会允许你:
- 读取JSON数组
- 将数组项作为JSON对象进行迭代
- 将对象序列化回缓冲区
- 使用
JsonFormat
解析各个对象