Java: JSON String -> LIST OF Protobuf


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.Readermerge方法的重载,您可能可以在不实际连接任何字符串的情况下实现这一点(以防它是一个非常大的消息,这很重要(,尽管它需要类似于SequenceReader的东西,而标准库中不存在SequenceReader。

使用单独的JSON库

API将取决于你选择其中的哪一个,但有很多机会他们会允许你:

  1. 读取JSON数组
  2. 将数组项作为JSON对象进行迭代
  3. 将对象序列化回缓冲区
  4. 使用JsonFormat解析各个对象

最新更新