gpt4 book ai didi

java - 当我们使用枚举时找不到适合类型的构造函数 - Jackson JSON

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:05 26 4
gpt4 key购买 nike

我有一个看起来像这样的类:

   public class Content {

public enum Type {
TEXT, URL, FILE
}

public enum Rendering {
MARKDOWN, HTML, PLAIN, AUTO
}

public final Type type;
public final Rendering rendering;
public final String content;

public Content(Type type, Rendering rendering, String content) {
this.type = type;
this.rendering = (rendering != null ? rendering : Rendering.AUTO);
this.content = content;
}

}

我得到了一个如下所示的 JSON 字符串:

{
"type": "TEXT",
"rendering": "AUTO",
"content": "Lorem ipsum"
}

现在,因为 Content 类中的字段是最终的,Jackson 将不起作用,所以我使用 MixIns :

    public abstract static class ContentMixIn {
@JsonCreator
public ContentMixIn(@JsonProperty("type") Type type,
@JsonProperty("rendering") Rendering rendering,
@JsonProperty("content") String content) {
}
}

注意:我可以使用构造函数参数注释原始类,但Content 来 self 无法修改的库

这就是我使用它们的方式:

    // ... 
SimpleModule module = new SimpleModule();
module.setMixInAnnotation(Content.class, ContentMixIn.class);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
mapper.readValue("<the json>", Content.class);

这会抛出:

com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.foo.Content]: can not instantiate from JSON object (need to add/enable type information?)
at [Source: {
"type": "TEXT",
"rendering": "AUTO",
"content": "Lorem ipsum"
}; line: 2, column: 2]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1063)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:124)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3051)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2146)

为什么?通过简单地查看行号,我假设它在提示 enum Type,但我该如何更正它?

PS:MixIn 设置正确,因为当我用 String 值替换 Content 构造函数的枚举参数时,它可以工作(尽管不是我想要的方式):

        // ... in the Content class
public Content(String type, String rendering, String content) {
this.type = null;
this.rendering = null;
this.content = content;
}

// ... in the mixin class
@JsonCreator
public ContentMixIn(@JsonProperty("type") String type,
@JsonProperty("rendering") String rendering,
@JsonProperty("content") String content) {
}

最佳答案

基本上,我导入了错误的类型,因为我使用的是 Intellij,当它询问要导入哪种类型时没有注意。

与 jackson 合作时,注意类型极其重要。

特别感谢@Sotirios,他就这个问题给了我很多建议,对我调试帮助很大。事实证明,我得到了另一个看起来像这样的类:

    public static class Image {
public enum Display {
COVER, CONTAIN, START, END
}
public enum Type {
BASE64, FILE, URL
}
public final Type type; // <-- this!
public final Display display;
public final int padding;
public final String content;

public Image(Type type, Display display, int padding, String content) {
this.type = type;
this.display = display;
this.padding = padding;
this.content = content;
}
}

Jackson 失败了,因为我使用的是 Image.Type在我的 MixIn 类和 Content.Type在我的实际类里面。 (它们在代码中看起来相同,因为 Intellij 进行了静态导入)

我还发现您应该始终使用 List<T>对于 JSON 数组 ( [...] ) 而不是 T[]

关于java - 当我们使用枚举时找不到适合类型的构造函数 - Jackson JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27647129/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com