【问题标题】:Jackson encode all properties to base64Jackson 将所有属性编码为 base64
【发布时间】:2019-09-29 11:51:30
【问题描述】:

我有多个类要序列化,例如使用 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 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);

问题是它只对 String 类型进行编码,因为序列化程序只接受一种类型,是否有任何方法来编码所有字段值(long、int、object 等)。我的意思是编码 json 的所有值关于它的字段类型是字符串还是整数??

【问题讨论】:

    标签: java json jackson base64


    【解决方案1】:

    您可以使用以下内容:

    序列化器

    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="
    }
    

    【讨论】:

    • 像魅力一样工作!!,但你不需要添加 ,泛型似乎只是更广泛的方法 ,顺便说一句,我正在做你提到的,但是我忘了创建 Base64Serializer 的新实例,所以每次添加模块时我都会覆盖传递类型:(干得好@i.bondarenko
    【解决方案2】:

    以防万一有人正在寻找使用 Jackson 或 Gson 之类的东西将任何类型的对象转换为 Base64 字符串。你可以这样做:

    1. 使用 Jackson/Gson 将您的对象转换为字符串:

      str = objectMapper.writeValueAsString(obj) 或者 str = gson.toJson(obj)

    2. 现在您可以使用

      从字符串中获取字节

      base64str = str.getBytes()

    3. 使用java的Base64类将字节转换为Base64字符串:

      Base64.getEncoder().encodeToString(base64str)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-24
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 2019-09-09
      • 1970-01-01
      • 2014-07-01
      相关资源
      最近更新 更多