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==
オブジェクトジャクソン検索をシリアル化するには、@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;
}
}