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 的类型?
mapper.writeValueAsString(classA)会将实例序列化为类似于{"rawData":{}}.
反序列化{}默认映射器会失败,因为它被视为{}不可序列化类型。如果您之前已经配置过SerializationFeature.FAIL_ON_EMPTY_BEANS,false则会创建一个空的Object。
您可能希望使用mapper.enableDefaultTyping();在 JSON 中包含类型信息,从而反序列化为正确的类型。
注意:如果传入内容来自不受信任的来源,则使用默认类型可能会存在潜在的安全风险,建议不要这样做,或者如果启用,则使用传递将要使用的
setDefaultTyping合法TypeResolverBuilder类型列入白名单的自定义实现。