gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:58:29 32 4
gpt4 key购买 nike

A类

public class ClassA {
private String id;
private Object rawData;
}

B类

public class ClassB {
private String name;
}

C类

public class ClassC {
String address;
}

主类

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");
}
}
}

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

如何检查rawData的类型?

最佳答案

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

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

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

NOTE: use of Default Typing can be a potential security risk if incoming content comes from untrusted sources, and it is recommended that this is either not done, or, if enabled, use setDefaultTyping passing a custom TypeResolverBuilder implementation that white-lists legal types to use.

关于java jackson如果对象类型的变量序列化后保留类型信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52717667/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com