有没有一种简单的方法可以使用 Jackson 将对象序列化为 base64 编码的 JSON?(对象-> JSON-> base64)
我尝试使用 custom 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);
}
}
不需要创建 a new ObjectMapper,因为我需要默认 ObjectMapper 的所有已注册模块和序列化程序。
我希望有一些更简单的方法来实现这一点。
编辑:示例
第 1 步:Java 对象
class Foo {
String field1 = "foo";
int field2 = 42;
}
第 2 步:JSON
{"field1":"foo","field2":42}
第三步:Base64
eyJmaWVsZDEiOiJmb28iLCJmaWVsZDIiOjQyfQ==