FastJSON的parseObject使用模板方法该怎么进行强制转换?

TAT_Hins TAT_Hins 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
各位大佬们请问一下,在FastJSON的parseObject方法里,转换类型想要使用类似于TypeReference<T extends AccessResult>这样的方法,AccessResult是一个父类,实际的类型是它的子类,但是我发现如果用以下的转换语句:
T retObj = JSON.parseObject(response.body().string(), new TypeReference<T>(){});

就会在此处跳出ClassCastException报错,JSONObject无法转换为AccessResult。而如果我写成:
T retObj = (T) JSON.parseObject(response.body().string(), new TypeReference<AccessResult>(){});

则不会报错,但生成的retObj为AccessResult类型,而实际上我需要它是AccessResult的子类UserAccessResult,向下强制转换的话同样会报错AccessResult无法转换为UserAccessResult。请问我该怎么做?
以下是代码:
1. 这是父类和子类,原本我想直接把AccessResult写成泛型的,因为AccessResult其实是网络请求返回结果的载体,responseBody实际上是根据需要返回不同的Bean对象。

public class AccessResult {

private Boolean result;

private String status;

protected Object responseBody;

public void setResult(Boolean result){
this.result = result;
}

public Boolean getResult(){
return this.result;
}

public void setStatus(String status) {
this.status = status;
}

public String getStatus() {
return this.status;
}

protected void setResponseBody(Object responseBody) {
this.responseBody = responseBody;
}

protected Object getResponseBody() {
return this.responseBody;
}
}

public class UserAccessResult extends AccessResult {

private User user = (User) responseBody;

public void setUser(User user) {
this.user = user;
}

public User getUser() {
return this.user;
}

}

2. 这是具体实现代码

public static <T extends AccessResult> T post(Object params, String url){
……
// 初始化返回对象
T retObj = null;
try {
//创建调用对象,重写回调函数
Response response = okHttpClient.newCall(request).execute();

if (response.isSuccessful()){
// success
retObj = JSON.parseObject(response.body().string(), new TypeReference<T>(){});
response.body().close();
}
else {
response.body().close();
throw new IOException("Unexpected code " + response);
}
} catch (NullPointerException | IOException e){
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
} finally {
return retObj;
}
}


UserAccessResult result = NetCommunication.post(u, getString(R.string.server_host_url) + "/login");
if (result != null && result.getResult()) {
app.setCurrentUser(result.getUser());
return true;
} else return false;
...全文

相关推荐

JSON.parseObject和JSON.toJSONString实例详解

当我们使用`JSON.parseObject(jsonString, Staff.class)`时,Fastjson尝试将JSON字符串映射到`Staff`类的对象。

weixin_38748875

Fastjson JSON.parseObject非法字符报错原因与排查方法

JSON解析是Java后端日常开发中高频使用的技术操作,而fastjson的JSON.parseObject方法在解析字符串时会对每一个字符进行严格校验,一旦遇到非法字符便会抛出异常,导致接口调用、配置文件读取等场景直接失败。这类问题常源于字符串拼接时未转义的双引号、隐藏的BOM头、不可见控制字符或编码不一致产生的乱码。理解JSON规范中结构字符与转义规则是排查的基础,掌握从报错信息定位、二分法压缩范围、到十六进制查看原始数据等工程化手段,能快速锁定问题根源。通过统一编码规范、禁止手工拼接JSON、增加数据

weixin_31315567

FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换操作

JSON格式字符串到JSON对象的转换: 使用`JSON.parseObject()`方法可以将JSON格式的字符串转换为JSONObject对象。

weixin_38675746

基于FastJson实现JSON与Java对象转换

本文档介绍了如何利用阿里巴巴的FastJson库进行JSON与Java对象之间的转换,这对于在Java开发中处理前后端数据交互非常实用。FastJson是一个高效的Java对象与JSON之间的转换工具

weixin_38564598

fastjson使用

- **缓存**:对于频繁使用的序列化/反序列化对象,可以考虑使用 Fastjson 提供的缓存机制提高性能。- **注意性能**:尽量减少不必要的 JSON 转换,尤其是在循环或高并发场景下。

qq649871723
评论 1
收藏 已收藏
分享
返回顶部
TAT_Hins
Java EE 67,535 成员 225,843 内容