使用Jackson将protobuf转换为JSON?

bqf10yzr  于 2023-03-24  发布在  其他
关注(0)|答案(7)|浏览(251)

我在使用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)
h5qlskok

h5qlskok1#

目前(2018年10月)序列化protobuf的方法是以以下方式使用com.google.protobuf.util.JsonFormat

JsonFormat.printer().print(myMessageOrBuilder)

我在protobuf对象之前使用了@JsonSerialize(using = MyMessageSerializer.class)注解,并添加了这个类:

public static class MyMessageSerializer extends JsonSerializer<Message> {
    @Override
    public void serialize(Message message, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeRawValue(JsonFormat.printer().print(message));
    }
}

这允许new ObjectMapper().writeValueAsString(wrapperObject)正确地将我的protobuf转换为JSON。

3htmauhk

3htmauhk2#

我使用JsonFormat类(com.googlecode.protobuf.format.JsonFormat)来转换protobuf:

new JsonFormat().printToString(myObject)

这对我来说很完美。

eit6fx6z

eit6fx6z3#

包含已从com.googlecode.protobuf.format.JsonFormat更改为com.google.protobuf.util.JsonFormat
因此,如果您的protobuf依赖项缺少format包,请尝试在util中查找JsonFormat
有了这个include,您应该能够使用

new JsonFormat().printToString(myObject)

@amad-person建议的。

6xfqseft

6xfqseft4#

您应该使用com.google.protobuf.util.JsonFormat包中的以下类:

JsonFormat.printer().print()
j8yoct9x

j8yoct9x5#

我只是有这个问题,并使用下面的代码从Message对象创建JSON:

JsonFormat.printer().print(getMessageCockroachDB)

3pmvbmvn

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的应用程序。

cnh2zyt3

cnh2zyt37#

我的解决方案使用@JsonComponent:

@JsonComponent
public class MessageSerializer  extends JsonSerializer<Message> {

    @Override
    public void serialize(Message value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeRawValue(JsonFormat.printer().print(value));
    }
}

这也将序列化器注册到Message.class的ObjectMapper。

相关问题