java - Jackson 与泛型 JSON 无法构造 java.lang.Class 的实例

标签 java json generics jackson

我有一个带有多个 Web 模块的 Java Web 应用程序。一个模块将充当服务器,另一个模块将充当客户端,两者都部署在不同的服务器中。客户端应用程序将通过休息服务调用服务器应用程序来获取和保存数据。我从服务器获取一个 JSON 字符串,并尝试将其转换为具有通用类型的对象。

这是我的对象

 public class MyObject<T> {

    private String name;
    private List<T> list;

    private final Class<T> referenceType;

    @JsonCreator
    public MyObject(@JsonProperty("referenceType") Class<T> referenceType) {
        this.referenceType = referenceType;
        list = new ArrayList<T>();
    }

    public Class<T> getReferenceType() {
        return this.referenceType;
    }

//getter and setter
}

在服务器中,我按以下方式设置对象

public String getAll(Long key) {
    List<SomeObject> list = someObjectDao.getAll(key);
    MyObject<SomeObject> myObject = new MyObject<SomeObject>(
                    SomeObject.class);
    appObject.setList(list);
    JSONObject jsonget = new JSONObject(myObject);
    return jsonget.toString();
}

在客户端应用程序中,我得到这样的 JSON 字符串

{"name":"someName","referenceType":"class com.pkg.model.SomeObject","list":[{list - index - 0},{list - index-1}]}

我正在尝试通过以下方式将字符串转换为 MyObject 类型

private MyObject readJson(String output) throws Exception {
        return new ObjectMapper().readValue(output,
                    new TypeReference<MyObject>() {
                    });
    }

但是我遇到了以下异常,

Can not construct instance of java.lang.Class, problem: class com.pkg.model.SomeObject
 at [Source: java.io.StringReader@4f906bf5; line: 1, column: 151]

如何将 JSON 字符串转换为对象?

谢谢。

最佳答案

您的客户端正常,您正在读取的 JSON 无效

以下内容将正确反序列化

"referenceType":"com.pkg.model.SomeObject"

这样你就会被列表部分困住了。

设置服务器端使用 jackson,例如

return new ObjectMapper().writeValueAsString(myObject);

可以解决您的问题

关于java - Jackson 与泛型 JSON 无法构造 java.lang.Class 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27939219/

相关文章:

java - 如何使用 xpath 获取遵循特定部分中的模式的链接?

java - Spring 启动: automatic JSON message converter for @Requestbody GET doesn't work

java - Java中如何将句子存储在临时数组中?

java - "Wrong"应用程序被固定到任务栏 (Windows 7)

java - Adapter.getView 从未被称为 Android Studio

json - 将普通的旧groovy转换为JSON

java - BufferedReader 无法读取长行

swift - 试图 swift 概括

generics - 具有通配符泛型类型的 Lambda

Android - Java 泛型 SpinnerAdapter