java jackson如果对象类型的变量序列化后保留类型信息

Pra*_*A.K 2 java serialization jackson deserialization objectmapper

A级

public class ClassA {
   private String id;
   private Object rawData;
}
Run Code Online (Sandbox Code Playgroud)

B级

public class ClassB {
   private String name;
}
Run Code Online (Sandbox Code Playgroud)

C类

public class ClassC {
   String address;
}
Run Code Online (Sandbox Code Playgroud)

主班

public class MainExample {
   public static void main( String[] args ) throws IOException {

      ObjectMapper mapper = new ObjectMapper(  );

      ClassB classB = new ClassB();
      //ClassC classC = new ClassC();
      ClassA classA = new ClassA();
      classA.setRawData(  classB );
      //classA.setRawData(  classC );

      if (classA.getRawData() instanceof ClassB) {
         System.out.println("true ");
      } else {
         System.out.println("false");
      }

      String classAString = mapper.writeValueAsString( classA );
      ClassA a = mapper.readValue( classAString, ClassA.class );

      if (a.getRawData() instanceof ClassB) {
         System.out.println("true ");
      } else {
         System.out.println("false");
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

为什么第一个 if-else 打印“TRUE”而第二个 if-else 打印“false”

如何检查 rawData 的类型?

And*_*lko 6

mapper.writeValueAsString(classA)会将实例序列化为类似于{"rawData":{}}.

反序列化{}默认映射器会失败,因为它被视为{}不可序列化类型。如果您之前已经配置过SerializationFeature.FAIL_ON_EMPTY_BEANSfalse则会创建一个空的Object

您可能希望使用mapper.enableDefaultTyping();在 JSON 中包含类型信息,从而反序列化为正确的类型。

注意:如果传入内容来自不受信任的来源,则使用默认类型可能会存在潜在的安全风险,建议不要这样做,或者如果启用,则使用传递将要使用的setDefaultTyping合法TypeResolverBuilder类型列入白名单的自定义实现。