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

JSONMappingException-无法取消Java对象的序列化

单于庆
2023-03-14

使用ObjectMapper反序列化对象时,我遇到以下错误:

JSONMappingException无法构造组织的实例。springframework。数据页,问题:抽象类型只能用附加类型信息进行实例化。

我试图将JSON字符串序列化为Spring数据对象org.springframework.data.Page,表示类型为T的页面。

User类是一个简单的POJO,具有firstlast名称。我正在反序列化的JSON字符串是:

{
    "content": [
        {
            "firstname": "John",
            "lastname": "Doe"
        },
        {
            "firstname": "Jane",
            "lastname": "Doe"
        }
    ],
    "size": 2,
    "number": 0,
    "sort": [
        {
            "direction": "DESC",
            "property": "timestamp",
            "ascending": false
        }
    ],
    "totalPages": 150,
    "numberOfElements": 100,
    "totalElements": 15000,
    "firstPage": true,
    "lastPage": false
}

这会导致异常:

Page<User> userPage = (Page<User>) new ObjectMapper().mapToJavaObject(json, new TypeReference<Page<User>>(){};

因为Page是Spring对象,所以我不能修改它,我认为这与我在其他地方看到的问题有点不同。有什么想法吗?

共有2个答案

司空健
2023-03-14

您可以这样做:

public class YourClass {

    static class CustomPage extends PageImpl<User> {

        @JsonCreator(mode = Mode.PROPERTIES)
        public CustomPage(@JsonProperty("content") List<User> content, @JsonProperty("number") int page, @JsonProperty("size") int size, @JsonProperty("totalElements") long total) {
            super(content, new PageRequest(page, size), total);
        }

    }

    public Page<User> makeRequest(String json) {

        Page<User> pg = new ObjectMapper().readValue(json, CustomPage.class);
        return pg;

    }

}    
吕鸿朗
2023-03-14

我最终使用了类似的东西,按照@Perception的建议创建了一个bean:

import java.util.ArrayList;
import java.util.List;

import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;

public class PageImplBean<T> extends PageImpl<T> {

    private static final long serialVersionUID = 1L;
    private int number;
    private int size;
    private int totalPages;
    private int numberOfElements;
    private long totalElements;
    private boolean previousPage;
    private boolean firstPage;
    private boolean nextPage;
    private boolean lastPage;
    private List<T> content;
    private Sort sort;

    public PageImplBean() {
        super(new ArrayList<T>());
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getTotalPages() {
        return totalPages;
    }

    public void setTotalPages(int totalPages) {
        this.totalPages = totalPages;
    }

    public int getNumberOfElements() {
        return numberOfElements;
    }

    public void setNumberOfElements(int numberOfElements) {
        this.numberOfElements = numberOfElements;
    }

    public long getTotalElements() {
        return totalElements;
    }

    public void setTotalElements(long totalElements) {
        this.totalElements = totalElements;
    }

    public boolean isPreviousPage() {
        return previousPage;
    }

    public void setPreviousPage(boolean previousPage) {
        this.previousPage = previousPage;
    }

    public boolean isFirstPage() {
        return firstPage;
    }

    public void setFirstPage(boolean firstPage) {
        this.firstPage = firstPage;
    }

    public boolean isNextPage() {
        return nextPage;
    }

    public void setNextPage(boolean nextPage) {
        this.nextPage = nextPage;
    }

    public boolean isLastPage() {
        return lastPage;
    }

    public void setLastPage(boolean lastPage) {
        this.lastPage = lastPage;
    }

    public List<T> getContent() {
        return content;
    }

    public void setContent(List<T> content) {
        this.content = content;
    }

    public Sort getSort() {
        return sort;
    }

    public void setSort(Sort sort) {
        this.sort = sort;
    }

    public PageImpl<T> pageImpl() {
        return new PageImpl<T>(getContent(), new PageRequest(getNumber(),
                getSize(), getSort()), getTotalElements());
    }
}

然后修改代码以使用具体类并获得PageImpl:

@SuppressWarnings("unchecked")
Page<User> userPage = ((PageImplBean<User>)new ObjectMapper().readValue(json, new TypeReference<PageImplBean<User>>() {})).pageImpl();
 类似资料:
  • 问题内容: 使用取消序列化对象时出现以下错误: JSONMappingException无法构造org.springframework.data.Page的实例,问题:抽象类型只能用其他类型信息实例化。 我正在尝试将JSON字符串序列化为表示类型页面的Spring数据对象T。 该User班是一个简单的与和名称。我要反序列化的字符串是: 这将导致异常: 由于是对象,因此无法修改它,我认为这与我在别处

  • 问题内容: 我正在尝试使用Jackson将json数据转换为POJO对象。这是MainActivity和我的POJO类代码。我基本上收到了JsonMappingException错误。我还附上了整个日志。 MainActivity.java: Entries.java(这是POJO) 现在,我的日志中出现以下错误。因此,我无法继续工作。这是日志: 问题答案: 在 条目* 和 电话中 删除构造函数

  • 我使用avro工具从avsc文件生成java类,使用: 然后,我试图通过ObjectMapper将这些对象序列化为json,但总是得到一个JsonMappingException,上面写着“不是枚举”或“不是联合”。在我的测试中,我使用其生成器或构造函数创建生成的对象。我对不同类的对象有这样的例外。。。 示例代码: 我还使用:serializer尝试了许多配置。配置(…)但还是失败了。版本:Jav

  • 我在序列化Jackson中的泛型对象时遇到问题。我已经找到了一个解决方法,但我仍然不知道为什么我原来的解决方案不起作用。以下是我的设置: 以下是我当前用于序列化方法的代码: 以下是应该起作用但不起作用的: 对于第二种情况,我得到了以下例外: 这是什么原因?从ClassB中的类型规范可以清楚地看出,列表中只能使用ParamClass,不能使用BaseParamClass。我错过什么了吗?

  • (数据类)实体。JAVA (数据类)实体。JAVA 我试着说: 我犯了一个错误: 我已经把和我错过了什么?

  • 我不能读取属性作为自定义类'Himno'。当我尝试时,即使我注释一行,我也会得到一个“运行时间异常”:。然而,我可以得到属性到相应的变量。 E/AndroidRuntime:致命异常:主进程:组织。我的应用程序,PID:10532 java。lang.RuntimeException:无法反序列化对象。无法转换com类型的对象。谷歌。火基。消防商店。文档引用类型org。我的应用程序。模型Himno