【问题标题】:Deserialization with JacksonJackson 反序列化
【发布时间】:2014-11-17 10:29:15
【问题描述】:

我有一个用户界面:

public interface User{
    public static final String USER_KEY = "UK";
    public String getSessionKey();
    public List<Ties> getTies(); 
}

还有一些用户界面层次结构: 抽象类 UserKind1 实现用户 抽象类 UserKind2 实现用户

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 使用相同的 impl。

问题:如何正确使用 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]

【问题讨论】:

    标签: java json serialization jackson deserialization


    【解决方案1】:
    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 类创建默认构造函数

    【讨论】:

    • 是的,没错,但是问题呢?对象如何反序列化,实现在Factory中?
    • 请问哪个问题?
    • 对象如何反序列化,在Factory中实现?
    • programmerbruce.blogspot.in/2011/05/… 看看它可能对你有帮助
    • 感谢 Sagar Pudi。在那篇文章中,我们注册或指定了 impl 类,但在这种情况下,UserKind1Factory 有私有 impl。
    猜你喜欢
    • 2019-09-17
    • 2021-01-19
    • 1970-01-01
    • 2013-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2018-05-25
    相关资源
    最近更新 更多