Java Jackson将所有属性编码为base64
例如,我想使用Jackson序列化多个类以生成JsonJava Jackson将所有属性编码为base64,java,json,jackson,base64,Java,Json,Jackson,Base64,例如,我想使用Jackson序列化多个类以生成Json public class A{ int id; String name; Object database; ... getter and setter } 我需要将json的所有值编码为base64,所以我像这样配置对象映射器 public class Base64Serializer<T> extends StdSerializer<T> { private static final l
public class A{
int id;
String name;
Object database;
... getter and setter
}
我需要将json的所有值编码为base64,所以我像这样配置对象映射器
public class Base64Serializer<T> extends StdSerializer<T> {
private static final long serialVersionUID = 1L;
protected Base64Serializer(Class<?> t, boolean f) {
super(t, f);
}
@Override
public void serialize(T value, JsonGenerator jsonGenerator, SerializerProvider arg2) throws IOException {
String ecnodedOutput = Base64.getEncoder().encodeToString(((String) value).getBytes());
jsonGenerator.writeString(ecnodedOutput);
}
}
//Using the base64 Serializer to configure Object mapper
SimpleModule module = new SimpleModule();
module.addSerializer(new Base64Serializer(String.class, false));
objectMapper.registerModule(module);
objectMapper.writerWithDefaultPrettyPrinter().writeValue(outputStream,intanceOfClassA);
public类base64序列化程序扩展StdSerializer{
私有静态最终长serialVersionUID=1L;
受保护的Base64Serializer(类t,布尔f){
super(t,f);
}
@凌驾
public void serialize(T值、JsonGenerator、JsonGenerator、SerializerProvider arg2)引发IOException{
字符串ecnodeOutput=Base64.getEncoder().encodeToString(((字符串)值).getBytes());
jsonGenerator.writeString(ECNodeOutput);
}
}
//使用base64序列化程序配置对象映射器
SimpleModule=新的SimpleModule();
addSerializer(新的Base64Serializer(String.class,false));
objectMapper.registerModule(模块);
objectMapper.writerWithDefaultPrettyPrinter().writeValue(outputStream,intanceOfClassA);
问题是它只编码字符串类型,因为序列化程序只接受一种类型,是否有任何方法来编码所有字段值(long、int、object等)我的意思是编码json字段中与字符串或int类型相关的所有值???您可以使用以下方法: 序列化程序
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Base64;
public class Base64Serializer<T extends Serializable> extends StdSerializer<T> {
private static final long serialVersionUID = 1L;
protected Base64Serializer(Class<?> t, boolean f) {
super(t, f);
}
@Override
public void serialize(T value, JsonGenerator jsonGenerator, SerializerProvider arg2) throws IOException {
String ecnodedOutput = Base64.getEncoder().encodeToString(serialize(value));
jsonGenerator.writeString(ecnodedOutput);
}
public static byte[] serialize(Object obj) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(out);
os.writeObject(obj);
return out.toByteArray();
}
}
输出:
public class SerializerTest {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
addSerializers(module, Serializable.class, int.class, double.class, float.class, char.class, byte.class, short.class);
objectMapper.registerModule(module);
System.out.println(objectMapper.writeValueAsString(new A(10, "test", Arrays.asList(10000L, "TTTT2"))));
}
private static void addSerializers(SimpleModule module, Class... classes) {
Arrays.stream(classes).forEach(c -> module.addSerializer(new Base64Serializer(c, false)));
}
}
{
"id": "rO0ABXNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAK",
"name": "rO0ABXQABHRlc3Q=",
"database": "rO0ABXNyABpqYXZhLnV0aWwuQXJyYXlzJEFycmF5TGlzdNmkPL7NiAbSAgABWwABYXQAE1tMamF2YS9sYW5nL09iamVjdDt4cHVyABdbTGphdmEuaW8uU2VyaWFsaXphYmxlO67QCaxT1+1JAgAAeHAAAAACc3IADmphdmEubGFuZy5Mb25nO4vkkMyPI98CAAFKAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAAAAACcQdAAFVFRUVDI="
}
以防万一,如果有人正在寻找使用类似Jackson或Gson的东西将任何类型的对象转换为Base64字符串。你可以这样做:
很有魅力!!,但您不需要添加,泛型似乎只是更广泛的方法,顺便说一句,我正在做您提到的事情,但我忘了创建Base64Serializer的新实例,所以每次添加模块时我都重写传递类型:(很好@I.bondarenko)