当前位置: 首页 > 知识库问答 >
问题:

使用自定义序列化方法序列化泛型对象时出现JsonMappingException

琴献
2023-03-14

我在序列化Jackson中的泛型对象时遇到问题。我已经找到了一个解决方法,但我仍然不知道为什么我原来的解决方案不起作用。以下是我的设置:

public class ClassA<P>{
    protected final LinkedList<P> list;

    public ClassA(LinkedList<P> list){
        this.list = list;
    }
}

@JsonValue
public class ClassB extends ClassA<ParamClass>{
    public ClassB(LinkedList<ParamClass> list) {
       super(list);
    }

    @JsonCreator
    public ClassB(int[] array) {
        this(getList(array));
    }

    public int[] serialize(){
        ...
    }
}

public class ParamClass extends BaseParamClass{
    public int getInt(){
        ...
    }
}

以下是我当前用于序列化方法的代码:

@JsonValue
public int[] serialize(){
    int[] array = new int[list.size()];
    for (int i = 0; i < array.length; i++) {
        BaseParamClass paramClass = list.get(i);
        locationsArray[i] = paramClass.getInt();
    }
    return locationsArray;
}

以下是应该起作用但不起作用的:

@JsonValue
public int[] serialize(){
    int[] array = new int[list.size()];
    for (int i = 0; i < array.length; i++) {
        ParamClass paramClass = list.get(i);
        locationsArray[i] = paramClass.getInt();
    }
    return locationsArray;
}

对于第二种情况,我得到了以下例外:

com.fasterxml.jackson.databind.JsonMappingException(packages.BaseParamClass cannot be cast to another.packages.ParamClass)

这是什么原因?从ClassB中的类型规范可以清楚地看出,列表中只能使用ParamClass,不能使用BaseParamClass。我错过什么了吗?

共有1个答案

钦良弼
2023-03-14

你需要告诉Jackson的ObjectMapper目标类的泛型类型:

ObjectMapper mapper = new ObjectMapper();
TypeFactory factory = mapper.getTypeFactory();
JavaType paramClassType = factory.constructType(ParamClass.class);
JavaType classBType = factory.constructSimpleType(ClassB.class, new JavaType[]{paramClassType});
mapper.readValue(src, classBType);
 类似资料:
  • 问题内容: 确定,所以我编辑了问题,因为它不够清楚。 编辑2 :更新了JSON文件。 我在Android应用程序中使用GSON,我需要解析来自服务器的JSON文件,这些文件有点太复杂了。我不想让我的对象结构太沉重,所以我想简化内容: 所以我的对象的结构将不是JSON文件的结构。 例如,如果在JSON中,我有以下内容: 我不想保留我当前的对象结构,即一个对象,其中包含一个和一个“总计”。但是我只想将

  • 我想以 json 格式序列化一个自定义对象,其中 entryData 是我的域对象的列表。像这样: 下面是我在一次尝试中为获得json输出所做的工作: 但结果是entryData评估为字符串,引号转义: 我也尝试过这样做: 但是我得到了这个例外:

  • 我有下面的JSON,我正试图使用Jackson API反序列化它 我基本上需要一个附件类,它有一个AttachmentFile对象列表,如下所示: 如何使用自定义反序列化器实现这一点? 谢谢

  • 我目前正在将一些代码从Jackson1.x迁移到Jackson2.5json映射器,遇到了一个1.x中没有的问题。 这是设置(参见下面的代码): 接口IPET 类Dog实现IPET IPET使用@jsonTypeInfo和@jsonSubtypes进行注释 类Human具有一个类型为IPet的属性,该属性使用@JSONSerialize(using=CustompetSerializer.clas

  • 我有以下控制器: 使用以下请求对象: 当帖子通过并查看我得到的对象时,有效负载列表中有LinkedHashMap对象,而不是我的DTO类型的对象。 如何让Spring jackson将JSON转换为我的DTO对象。请记住,我计划对其他对象列表重用包装器响应DTO,这就是我使用通用列表(List)的原因。 这是我正在尝试的JSON。

  • 我目前正在研究一个使用泛型的模型,它有点复杂。我知道类似的问题也得到了回答,但没有一个能明确回答我的问题。 这是我的模型: 我的目标是使用jackson进行序列化和反序列化,如下所示: 我得到了以下java。序列化过程中的lang.StackOverflower错误: 非常感谢您的帮助。