[英]Deserialization with Jackson
I have a User interface: 我有一个用户界面:
public interface User{
public static final String USER_KEY = "UK";
public String getSessionKey();
public List<Ties> getTies();
}
And some hierarchy of User interface: abstract class UserKind1 implements User abstract class UserKind2 implements User 用户界面的一些层次结构:抽象类UserKind1实现User抽象类UserKind2实现User
public interface Ties{
public String getId();
}
Implementation of UserKind{1,2} is in UserKind{1,2}Factory, for example: 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;
}
...
}
}
and the same impl for UserKind2 and Ties. 和UserKind2和Ties的相同含义。
Question: How correctlly use Jackson for deserialization UserKind1? 问题:如何正确使用Jackson进行反序列化UserKind1?
I do some modifications with originally code: 我对原始代码做了一些修改:
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"
}
but when I try deserialize this, it's crash with exception: 但是当我尝试反序列化时,它会崩溃,但异常:
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类创建默认的构造函数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.