我有一个用户界面:
public interface User{
public static final String USER_KEY = "UK";
public String getSessionKey();
public List<Ties> getTies();
}
以及用户界面的一些层次结构: 抽象类 UserKind1 实现 User 抽象类 UserKind2 实现 User
public interface Ties{
public String getId();
}
UserKind{1,2} 的实现是在 UserKind{1,2}Factory 中,例如:
public class UserKind1Factory {
public static UserKind1 createUserKind1(List<Ties> tieses){
return new UserKind1Impl(tieses);
}
public static UserKind1 createUserKind1(List<Ties> tieses, long sessionMaxTime){
return new UserKind1Impl(tieses, sessionMaxTime);
}
private static class UserKind1Impl extends UserKind1{
private List<Ties> legalTies;
private long sessionMaxTime = 18000000;
public UserKind1Impl(List<Ties> ties){
this.ties = ties;
}
public UserKind1Impl(List<Ties> ties, long sessionMaxTime){
this.ties = ties;
this.sessionMaxTime = sessionMaxTime;
}
...
}
}
UserKind2 和 Ties 具有相同的实现。
问题:如何正确使用 Jackson 进行反序列化 UserKind1?
我对原始代码做了一些修改:
public class UserKind1Factory {
@JsonCreator
public static UserKind1 createUserKind1(@JsonProperty("ties") Ties[] ties, @JsonProperty("sessionMaxTime") long sessionMaxTime) {
ArrayList tiesList = new ArrayList<Ties>();
for (int i = 0; i < ties.length; i++) {
tiesList.add(ties[i]);
}
return new UserKind1Impl(tiesList, sessionMaxTime);
}
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
public static class UserKind1Impl extends UserKind1{
...
}
}
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
@JsonSubTypes({ @JsonSubTypes.Type(value = TiesFactory.TiesImpl.class, name = "ties")})
public interface Ties
public class TiesFactory {
@JsonCreator
public static LegalTies createLegalTies(@JsonProperty("id") String id)
@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
public static class TiesImpl implements Ties{
... and get json:
{
"@class" : "ua.company.model.user.impl.UserKind1Factory$UserKind1Impl",
"legalTies" : [ {
"@class" : "ua.company.model.user.impl.TiesFactory$TiesImpl",
"id" : "100500"
}, {
"@class" : "ua.company.model.user.impl.TiesFactory$TiesImpl",
"id" : "200600"
} ],
"sessionMaxTime" : 100501,
"sessionKey" : "UK"
}
但是当我尝试反序列化它时,它崩溃并出现异常:
org.codehaus.jackson.map.JsonMappingException: No suitable constructor
found for type [simple type, class
ua.company.model.user.impl.UserKind1Factory$UserKind1Impl]: can not
instantiate from JSON object (need to add/enable type information?)
at [Source: [B@a85aa40; line: 2, column: 64]
最佳答案
org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class ua.company.model.user.impl.UserKind1Factory$UserKind1Impl]: can not instantiate from JSON object (need to add/enable type information?) at [Source: [B@a85aa40; line: 2, column: 64]
异常本身就有解决方案,您所需要做的就是为 POJO 类创建默认构造函数
关于java - 使用 Jackson 进行反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26970584/