fastjson T responseBean = JSON.parseObject(reuslt, new TypeReference< T>(){});

slwdgvem  于 2021-11-27  发布在  Java
关注(0)|答案(11)|浏览(636)

T responseBean = JSON.parseObject(reuslt, new TypeReference(){});
这样解析出来都是Object

cmssoen2

cmssoen21#

因为这种动态泛型是拿不到的~ 你一定要动态可以自己new一个ParameterizedTypeImpl当参数,不过据说如果不自己缓存ParameterizedTypeImpl对象会导致内存泄露

oug3syen

oug3syen3#

他的问题是T这种不确定的类型在运行时是直接被当作Object对待的, 如果写成, 则T一律被当作X对待,反正就是当不到真正的T的~

vom3gejh

vom3gejh4#

两种办法,一个是json里序列化的时候就带上@type,二是TypeRef

tez616oj

tez616oj5#

@lcl6 你这个文件解决了吗,我碰到同样的问题

hts6caw3

hts6caw36#

遇到类似同样的问题。

public abstract class VfNetCallback<T> extends AbsCallback<VfNetResponse<T>> {

    @Override
    public VfNetResponse<T> parseNetworkResponse(Response response, int id) throws Exception {
        VfNetResponse<T> netResponse = JSON.parseObject(response.body().toString(), VfNetResponse<T>.class);
        return netResponse;
    }

}

如上,想在parseNetworkResponse中针对VfNetResponse < T >.class进行解析,求问应该如何处理?
已知通过 Class< T > dataClass = (Class < T >) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 可以获取T对应的class。但现在想获取VfNetResponse< T >.class传入fastjson进行直接解析。

qhhrdooz

qhhrdooz7#

JSON.parseObject(json, new TypeReference( theClassOfT) );

In case of more than one ParameterizedType :

JSON.parseObject(json, new TypeReference<VfNetResponse<T, B>>( theClassOfT, theClassOfB) );

xnifntxz

xnifntxz8#

找到办法了。

@Override
    public VfNetResponse<T> parseNetworkResponse(Response response, int id) throws Exception {
        Type dataType =  ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        Type type = new ParameterizedTypeImpl(new Type[]{dataType}, null, VfNetResponse.class);
        VfNetResponse<T> netResponse = JSON.parseObject(response.body().string(), type);
        return netResponse;
    }
jexiocij

jexiocij9#

确实解决问题了,感谢。
定义子类,在子类明确中指定泛型的类型, 类似这样:
public class ParamParser extends AbstractParser<TestLoginParam>
我理解泛型类型不能完全动态的,ParameterizedType 这个类型也没办法new出来,只能先声明再获取, 定义多个子类,也算实现了动态。

xqk2d5yq

xqk2d5yq10#

使用子类A构造方法,间接传递泛型到父类B中,对序列化部分进行指定。

llew8vvj

llew8vvj11#

public static <T> T buildExpContent(String expContent, Class<T> clazz) {
    T t = JSON.parseObject(replace, clazz);
    return t;
}

相关问题