web-dev-qa-db-ja.com

ジャクソンはオブジェクトをJSONにbase64にシリアル化します(無限ループなし)

Jacksonを使用してオブジェクトをbase64エンコードされたJSONにシリアル化する簡単な方法はありますか? (オブジェクト-> JSON-> base64)

カスタムStdSerializerを使用してみましたが、これは(もちろん)無限ループになります。

class MySerializer extends StdSerializer<Foo> {
  public void serialize(Foo value, JsonGenerator gen, SerializerProvider provider) {
    StringWriter stringWriter = new StringWriter();
    JsonGenerator newGen = gen.getCodec().getFactory().createGenerator(stringWriter);
    gen.getCodec().getFactory().getCodec().writeValue(newGen, value);
    String json = stringWriter.toString();
    String base64 = new String(Base64.getEncoder().encode(json.getBytes()));
    gen.writeString(base64);
  }
}

回避策は、すべてのフィールドを別のクラスにコピーし、そのクラスを中間表現に使用することです。

class TmpFoo {
  public String field1;
  public int field2;
  // ...
}

class MySerializer extends StdSerializer<Foo> {
  public void serialize(Foo value, JsonGenerator gen, SerializerProvider provider) {
    TmpFoo tmp = new TmpFoo();
    tmp.field1 = value.field1;
    tmp.field2 = value.field2;
    // etc.

    StringWriter stringWriter = new StringWriter();
    JsonGenerator newGen = gen.getCodec().getFactory().createGenerator(stringWriter);
    gen.getCodec().getFactory().getCodec().writeValue(newGen, tmp); // here "tmp" instead of "value"
    String json = stringWriter.toString();
    String base64 = new String(Base64.getEncoder().encode(json.getBytes()));
    gen.writeString(base64);
  }
}

デフォルトのObjectMapperのすべての登録済みモジュールとシリアライザーが必要なため、new ObjectMapperの作成は望ましくありません。

これを実現する簡単な方法を期待していました。


編集:例

ステップ1:Java Object

class Foo {
  String field1 = "foo";
  int field2 = 42;
}

ステップ2:JSON

{"field1":"foo","field2":42}

ステップ3:Base64

eyJmaWVsZDEiOiJmb28iLCJmaWVsZDIiOjQyfQ==
3
Benjamin M

オブジェクトジャクソン検索をシリアル化するには、@JsonValueメソッドを使用します。 encodedJsonStringクラスに@JsonValueで注釈されたFooメソッドを追加できます。

これで試してください:

@Getter
@Setter
public class Foo implements Serializable {

    private static final long serialVersionUID = 1L;

    public String field1;
    public int field2;

    @JsonValue
    public String toEncodedJsonString() {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            new ObjectOutputStream(baos).writeObject(this);
            return org.Apache.commons.codec.binary.Base64.encodeBase64String(baos.toByteArray());
        }catch (Exception ex){

        }
        return null;
    }
}
0