我在使用Jackson的ObjectMapper将protobuf转换为JSON时遇到以下错误:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
Direct self-reference leading to cycle (through reference chain:
MyObjectPb$MyObject["unknownFields"]->
com.google.protobuf.UnknownFieldSet["defaultInstanceForType"])
MyObjectPb具有以下字段:
protected com.google.protobuf.UnknownFieldSet unknownFields
由于我在现有的代码库上工作,我有以下限制:
1.我不能修改MyObjectPb的源代码,所以我不能在MyObjectPb中使用Jackson的忽略注解。
1.我也不能使用Gson的库来转换对象,因为代码库已经使用Jackson进行序列化。不建议添加新的依赖项。
我如何告诉Jackson忽略(反)序列化MyObjectPb中的UnknownFieldSet对象?
我尝试了以下方法,但这些方法似乎无法解决问题:
a)配置ObjectMapper:
myObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
B)使用JacksonMixin:
@JsonIgnoreType
private abstract class UnknownFieldSetIgnoreMixIn {}
myObjectMapper.addMixIn(UnknownFieldSet.class, UnknownFieldSetIgnoreMixIn.class)
7条答案
按热度按时间h5qlskok1#
目前(2018年10月)序列化protobuf的方法是以以下方式使用
com.google.protobuf.util.JsonFormat
:我在protobuf对象之前使用了
@JsonSerialize(using = MyMessageSerializer.class)
注解,并添加了这个类:这允许
new ObjectMapper().writeValueAsString(wrapperObject)
正确地将我的protobuf转换为JSON。3htmauhk2#
我使用JsonFormat类(com.googlecode.protobuf.format.JsonFormat)来转换protobuf:
这对我来说很完美。
eit6fx6z3#
包含已从
com.googlecode.protobuf.format.JsonFormat
更改为com.google.protobuf.util.JsonFormat
因此,如果您的protobuf依赖项缺少
format
包,请尝试在util
中查找JsonFormat
。有了这个include,您应该能够使用
@amad-person建议的。
6xfqseft4#
您应该使用
com.google.protobuf.util.JsonFormat
包中的以下类:j8yoct9x5#
我只是有这个问题,并使用下面的代码从Message对象创建JSON:
3pmvbmvn6#
这里有一个Jackson的protobuf库:https://github.com/FasterXML/jackson-dataformats-binary
尽管关于如何使用它的文档很少!有一些关于如何使用它进行阅读/写作的例子:https://github.com/FasterXML/jackson-dataformats-binary/blob/2.14/protobuf/src/test/java/com/fasterxml/jackson/dataformat/protobuf/ReadSimpleTest.java#L66
然而,目前还不清楚这将如何坐在一个GRPC的应用程序。
cnh2zyt37#
我的解决方案使用@JsonComponent:
这也将序列化器注册到Message.class的ObjectMapper。