Java 使用Jackson进行JSON反序列化:找不到适合类型的构造函数-无法提供默认构造函数或注释构造函数

Java 使用Jackson进行JSON反序列化:找不到适合类型的构造函数-无法提供默认构造函数或注释构造函数,java,json,jackson,Java,Json,Jackson,我使用Jackson ObjectMapper将对象层次结构序列化为json字符串。之后,我想反序列化对象。我得到的例外如下 重要的是,APINEWDEALARRANGEMPLL类层次结构不在我的更改范围内-它是外部库的一部分。在这种情况下,我无法实现默认构造函数,也无法使用@JsonCreator注释 如何避免“未找到合适的构造函数”异常?在Jackson API中使用一些自定义的TypeResolverBuilder实现或其他功能是否可以解决这个问题?谢谢你的帮助 org.codehaus.

我使用Jackson ObjectMapper将对象层次结构序列化为json字符串。之后,我想反序列化对象。我得到的例外如下

重要的是,
APINEWDEALARRANGEMPLL
类层次结构不在我的更改范围内
-它是外部库的一部分。在这种情况下,我无法实现默认构造函数,也无法使用
@JsonCreator
注释

如何避免“未找到合适的构造函数”异常?在Jackson API中使用一些自定义的
TypeResolverBuilder
实现或其他功能是否可以解决这个问题?谢谢你的帮助

org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class com.tzero.api.transactions.TransactionState]: can not instantiate from JSON object (need to add/enable type information?)
 at [Source: java.io.StringReader@57ac3379; line: 4, column: 5] (through reference chain: com.tzero.api.java.transactions.APINewDealArrangementImpl["state"])
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObjectUsingNonDefault(BeanDeserializer.java:746)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:683)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732)
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1863)

您需要向类中添加一个无参数构造函数。Jackson需要为您的类创建一个实例,为了做到这一点,该类需要有一个无参数构造函数。

您需要向类中添加一个无参数构造函数。Jackson需要为您的类创建一个实例,为了做到这一点,该类需要有一个无参数构造函数。

您可以使用“mixin”在不同的类上提供注释。这有点奇怪,但非常有用

@Test
public void mixin_to_specify_creator() throws Exception {
    TargetData target = mapper.addMixIn(TargetData.class, TargetDataMixin.class).reader(TargetData.class)
            .<TargetData> readValue("{\"name\":\"the name\", \"description\":\"the description\"}");
    assertThat(target.name, equalTo("the name"));
    assertThat(target.description, equalTo("the description"));
}

public static class TargetData {
    private final String name;
    private final String description;

    public TargetData(String name, String description) {
        this.name = name;
        this.description = description;
    }
}

public static abstract class TargetDataMixin {
    @JsonCreator
    public TargetDataMixin(@JsonProperty("name") String name, @JsonProperty("description") String description) {
    }
}
@测试
public void mixin_to_specify_creator()引发异常{
TargetData target=mapper.addMixIn(TargetData.class,TargetDataMixin.class).reader(TargetData.class)
.readValue(“{\'name\':\'the name\',\'description\':\'the description\'}”);
资产(target.name,equalTo(“名称”));
资产(target.description,equalTo(“描述”));
}
公共静态类TargetData{
私有最终字符串名;
私有最终字符串描述;
公共TargetData(字符串名称、字符串描述){
this.name=名称;
this.description=描述;
}
}
公共静态抽象类TargetDataMixin{
@JsonCreator
public TargetDataMixin(@JsonProperty(“name”)字符串名称,@JsonProperty(“description”)字符串描述){
}
}
因此,这里在TargetData上没有Jackson注释,注释取自TargetDataMixin(并且完全忽略了TargetDataMixin的实现)

您可以使用“mixin”在不同的类上提供注释。这有点奇怪,但非常有用

@Test
public void mixin_to_specify_creator() throws Exception {
    TargetData target = mapper.addMixIn(TargetData.class, TargetDataMixin.class).reader(TargetData.class)
            .<TargetData> readValue("{\"name\":\"the name\", \"description\":\"the description\"}");
    assertThat(target.name, equalTo("the name"));
    assertThat(target.description, equalTo("the description"));
}

public static class TargetData {
    private final String name;
    private final String description;

    public TargetData(String name, String description) {
        this.name = name;
        this.description = description;
    }
}

public static abstract class TargetDataMixin {
    @JsonCreator
    public TargetDataMixin(@JsonProperty("name") String name, @JsonProperty("description") String description) {
    }
}
@测试
public void mixin_to_specify_creator()引发异常{
TargetData target=mapper.addMixIn(TargetData.class,TargetDataMixin.class).reader(TargetData.class)
.readValue(“{\'name\':\'the name\',\'description\':\'the description\'}”);
资产(target.name,equalTo(“名称”));
资产(target.description,equalTo(“描述”));
}
公共静态类TargetData{
私有最终字符串名;
私有最终字符串描述;
公共TargetData(字符串名称、字符串描述){
this.name=名称;
this.description=描述;
}
}
公共静态抽象类TargetDataMixin{
@JsonCreator
public TargetDataMixin(@JsonProperty(“name”)字符串名称,@JsonProperty(“description”)字符串描述){
}
}

因此,这里在TargetData上没有Jackson注释,注释取自TargetDataMixin(并且完全忽略了TargetDataMixin的实现)

这是@GarisMSuero的一个很好的用例,这不是重复的,因为我无法为序列化类实现默认的instructor。如上所述,原因是我无法修改该类-它是封闭源代码的。@peeskillet,谢谢:)这样做了。这个问题不是重复的,应该标记出来。原始问题假设可以修改该对象,而此问题假设该对象是第三方且不可更改。@TylerH您可以如上所述删除此问题中的重复标记吗?这是@GarisMSuero的一个很好的用例。这不是重复的,因为我无法为序列化类实现默认构造函数。如上所述,原因是我无法修改该类-它是封闭源代码的。@peeskillet,谢谢:)这样做了。这个问题不是重复的,应该标记出来。原始问题假设可以修改该对象,而此问题假设该对象是第三方且不可更改。@TylerH是否可以如上所述删除此问题中的重复标记?