JSON:反序列化子类型

时间:2013-11-29 09:00:18

标签: java json spring jackson fasterxml

此资源上已有same issue。但对我来说答案似乎完全错误,并且不适合我。

出了什么问题:

  

com.fasterxml.jackson.databind.JsonMappingException:无法解决   将id'MyRequest $ GetAll'输入[simple type,class]的子类型   请求]

我拥有的内容:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "@class")
@JsonSubTypes({ @JsonSubTypes.Type(value = MyRequest.GetAll.class)})
public class Request {
}

public class MyRequest extends Request {

    public static class GetAll extends MyRequest {
        public GetProfiles() {
    }
}

我尝试过做的事情:

我尝试遵循that建议,并将子类型注册从注释移到java代码:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "@class")
public class Request {
}

public class MyRequest extends Request {

    public static class GetAll extends MyRequest {
        public GetProfiles() {
    }
}

public class Utils {
    private static final ObjectMapper mapper;

    static {
        mapper = new ObjectMapper();
        registerSubtypes();
        mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
        mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
        mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
    } 

    private static registerSubtypes() { //REGISTER ALL SUBTYPES
      mapper.registerSubtypes(MyRequest.GetAll.class);
      //...
    }   
}

但没有结果,我仍然得到例外! 这种情况最令人好奇的是它在我的本地计算机上运行良好,但在部署后无效。

问题:

我应该尝试解决这个问题?

1 个答案:

答案 0 :(得分:1)

不确定是否有所作为,但您可能希望在子类型上使用@JsonTypeName来明确命名,而不是依赖于简单的类名。这样做更安全,如果你重构事物就不太可能导致问题(比如将类移到不同的包中)。