dus*_*tdn 5 java serialization json jackson deserialization
说我有一个接口A,我想为所有类实现接口A使用自定义反序列化器,所以我使用下面的代码,但它不起作用,而CustomAserializer工作.那么我应该怎么做反序列化所有类使用我的自定义反序列化器实现A. 谢谢.
module.addDeserializer(A.class, new CustomADeserializer());
module.addSerializer(A.class, new CustomASerializer())
Run Code Online (Sandbox Code Playgroud)
Sun*_*mar 12
您似乎错过了使用@JsonDeserialize(using = ImplementationClazz.class)来注释您的实现类,以指示用于反序列化抽象类或接口的类.
使用Jackson对具有多个实现的接口进行反序列化的简单示例.
这是我的界面
@JsonDeserialize(using = UserDeserializer.class)
public interface User {
}
Run Code Online (Sandbox Code Playgroud)
接口的一种实现
@JsonDeserialize(as = ServiceUser.class)
public class ServiceUser implements User{
private String name;
private String role;
//constructor, setters & getters
Run Code Online (Sandbox Code Playgroud)
第二次实施
@JsonDeserialize(as = AdminUser.class)
public class AdminUser implements User {
private String role;
private String designation;
//constructor, setters & getters
Run Code Online (Sandbox Code Playgroud)
这是De-serializer
public class UserDeserializer extends JsonDeserializer<User> {
@Override
public User deserialize(JsonParser jp, DeserializationContext context) throws IOException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = mapper.readTree(jp);
/*write your own condition*/
if (root.has("name") && root.get("name").asText().equals("XYZ")) {
return mapper.readValue(root.toString(), ServiceUser.class);
}
return mapper.readValue(root.toString(), AdminUser.class);
}
}
Run Code Online (Sandbox Code Playgroud)
如果不注释实现类,则可能会出现Stackoverflow错误.所有实现类都应该自行反序列化,否则它将使用导致StackOverflowError的父类反序列化器.
小智 8
以防万一有人需要一个解决方案来序列化和取消继承层次结构
您可以以更优雅的方式使用 Jackson 注释:JsonTypeInfo和JsonSubTypes
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@Type(value = ServiceUser.class, name = "service"),
@Type(value = AdminUser.class, name = "admin")
})
public interface User{
// ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7115 次 |
| 最近记录: |