为了账号安全,请及时绑定邮箱和手机立即绑定

杰克逊-使用泛型类反序列化

/ 猿问

杰克逊-使用泛型类反序列化

凤凰求蛊 2019-09-21 15:30:19

我有一个json字符串,应该将其反序列化为以下类


class Data <T> {

    int found;

    Class<T> hits

}

我该怎么做?这是通常的方式


mapper.readValue(jsonString, Data.class);

但是我怎么提到T代表什么呢?


查看完整描述

3 回答

?
吃鸡游戏

您需要为使用的TypeReference每种通用类型创建一个对象,并将其用于反序列化。例如,


mapper.readValue(jsonString, new TypeReference<Data<String>>() {});


查看完整回答
反对 回复 2019-09-21
?
繁花不似锦

您不能这样做:您必须指定完全解析的类型,例如Data<MyType>。T只是一个变量,并且毫无意义。


但是,如果您想T知道的只是静态的,则需要创建TypeReference动态等效项。引用的其他问题可能已经提到了这一点,但它看起来应该像这样:


public Data<T> read(InputStream json, Class<T> contentClass) {

   JavaType type = mapper.getTypeFactory().constructParametricType(Data.class, contentClass);

   return mapper.readValue(json, type);

}


查看完整回答
反对 回复 2019-09-21
?
紫衣仙女

首先要做的是序列化,然后可以进行反序列化。 

因此,当您进行序列化时,应该@JsonTypeInfo使杰克逊将类信息写入json数据。您可以做的是这样的:


Class Data <T> {

    int found;

    @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")

    Class<T> hits

}

然后,在反序列化时,您会发现杰克逊将数据反序列化为一个类,您的变量实际在运行时命中。


查看完整回答
反对 回复 2019-09-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信