我有一个消息定义的quotation_item.proto文件,其中有google.protobuf.Struct字段来解析元数据JSON。
message QuotationItemEntry {
// Other fields
google.protobuf.Struct metadata = 15;
}
此外,元数据字段在Java实体类中定义
public class QuotationItem {
// Other entity fields
private Map<String, Object> metadata;
}
我想使用Sping Boot 应用程序存储gRPC请求中传递的QuotationItemEntry对象,但无法转换java.util.Map<String, Object>
中的google.protobuf.Struct
字段。
4条答案
按热度按时间bogh5gae1#
在Java中,
google.protobuf.Struct
的字段值在其本机表示中不受支持。相反,它们由com.google.protobuf.Value
Package 。所以用google.protobuf.Struct#getFieldsMap()
方法,结果是Map<String, Value>
。您需要手动填充条目值。7cwmlq892#
voidzcy的答案正确地指出了在Java中处理Google Protobuf的Struct的复杂性,特别是使用Value Package 字段。我想提供一些更深入的理解,为那些新的Protobuf在整体上,阐明为什么这种设计的选择,以及它如何影响你作为一个开发人员。
Protobuf的Struct类型被设计成一个灵活的容器,可以容纳各种数据类型。这种设计选择对于处理半结构化或动态数据特别有益。这种灵活性允许Struct捕获不符合固定模式的数据。虽然这对于处理各种数据形状非常有用,但它带来了一个权衡:你就失去了强大的类型保证。
要更深入地理解
Protobuf
核心库中Struct
众所周知的消息的定义,我们可以查看Github上的.proto
描述下面的代码取自google protobuf的开源代码库:
因此,从上面的代码片段中,我们可以看出结构体本质上使用了我们上面讨论过的
map<>
,并将Value
存储到Map的字符串中。Value
是在同一个.proto
文件中定义的另一条消息,下面是Value
的外观:我们还可以查看
struct.proto
文件中的最后一个实体,以了解该值可以作为Value
的“目录”或“列表”:一些语言和框架可能使用内部的protobuf结构,而没有给开发人员提供“类似JSON”的接口来与它们的
Struct
进行交互例如,如果我们有以下JSON数据:
我们将有内部
Protobuf
伪代码结构,如:如果你想了解更多关于它我已经发布了一个Blog regarding this topic
fd3cxomn3#
我认为你可以通过元数据键来收集它们作为一个Map。这可以解决你的问题。
mm9b1k5b4#
Kotlin的解决方案:
使用方法: