Jackson with Generics JSON无法构造java.lang.Class的实例

时间:2015-01-14 09:10:03

标签: 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字符串转换为对象?

感谢。

1 个答案:

答案 0 :(得分:1)

您的客户端没问题,您正在阅读的JSON无效

以下将正确反序列化

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

比你将被困在列表部分。

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

return new ObjectMapper().writeValueAsString(myObject);

会解决您的问题