web-dev-qa-db-ja.com

Jacksonを使用してprotobufをJSONに変換しますか?

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の無視アノテーションを使用できません。
  2. コードベースではすでにシリアライズにJacksonを使用しているため、Gsonのライブラリを使用してオブジェクトを変換することもできません。新しい依存関係を追加することはお勧めしません。

MyObjectPb内のUnknownFieldSetオブジェクトを無視(非シリアル化)するようにJacksonに指示するにはどうすればよいですか?


私は以下を試しましたが、これらのアプローチは問題を解決しないようです:

a)ObjectMapperの構成:

myObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

b)ジャクソンミックスインの使用:

@JsonIgnoreType
private abstract class UnknownFieldSetIgnoreMixIn {}

myObjectMapper.addMixIn(UnknownFieldSet.class, UnknownFieldSetIgnoreMixIn.class)
6
amad-person

JsonFormatクラス(com.googlecode.protobuf.format.JsonFormat)を使用してprotobufを変換しました。

new JsonFormat().printToString(myObject)

これは私にとって完璧な仕事でした。

5
amad-person

Protobufをシリアル化する現在の方法(2018年10月)では、次のように_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.writeString(JsonFormat.printer().print(message));
    }
}
_

これにより、new ObjectMapper().writeValueAsString(wrapperObject)がprotobufをJSONに適切に変換できるようになりました。

5
M H Chu

インクルードが_com.googlecode.protobuf.format.JsonFormat_から_com.google.protobuf.util.JsonFormat_に変更されました

したがって、protobuf依存関係にformatパッケージがない場合は、JsonFormatutilを探してみてください。

これを含めると、@ amad-personが提案するようにJava new JsonFormat().printToString(myObject)を使用できるようになります。

3
kykrueger