引子
现在负责的业务 和 json 打交道比较多, 最近使用fastJson框架 json串转成泛型对象遇到了一个异常 :
java.lang.ClassCastException
还原下场景 :
模型Result<T>
复制代码
public class Result<T> {
private String msg;
private List<T> module;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public List<T> getModule() {
return module;
}
public void setModule(List<T> module) {
this.module = module;
}
}
复制代码
为什么要使用泛型, 可以理解泛型可以接受任意类型, 有些代码是公用的, 如结果集, 不可能为每个具体结果定义一个模型, 比如 Result<User>、Result<Item>等。
复制代码
public class User {
private Long user_id;
private String user_name;
public User() {
}
public User(Long userId, String name) {
this.user_id = userId;
this.user_name = name;
}
public Long getUser_id() {
return user_id;
}
public void setUser_id(Long user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
}
复制代码
下面直接看下泛型的转换
复制代码
复制代码
public static void main(String[] args) {
Result<User> r = new Result<User>();
r.setMsg("msg");
List<User> users = new ArrayList<>();
users.add(new User(1L, "hehe"));
users.add(new User(2L, "haha"));
r.setModule(users);
String js = JSON.toJSONString(r);
System.out.println(js);
Result<User> obj = (Result<User>)JSON.parseObject(js, Result.class);
User user = obj.getModule().get(0);
System.out.println(user);
}
复制代码
复制代码
复制代码
结果 :
{"module":[{"user_id":1,"user_name":"hehe"},{"user_id":2,"user_name":"haha"}],"msg":"msg"}
Exception in thread "main" java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.yuanmeng.json.User
at com.yuanmeng.json.fanxing.Client.main(Client.java:32)
复制代码
采用fastjson框架的 TypeReference 即可将json串转成定义好的泛型对象
Result<User> obj = (Result<User>) JSON.parseObject(js, new TypeReference<Result<User>>(){});
分享到:
相关推荐
前言:json字符串的转换类,需要FastJson类的支持。 注:解决Gson解析时遇到的泛型擦除问题及效率慢的问题
JSON(JavaScript Object Notation)是一种轻量级的...只需在项目的类路径下添加这两个JAR文件,即可利用它们的功能进行JSON转换。在Java项目中,可以通过`Class.forName()`或Maven、Gradle等构建工具来管理这些依赖。
3. 支持Java Bean:fastjson可以将JSON字符串转换成Java Bean,也可以将Java Bean转换成JSON字符串。 4. 支持泛型:fastjson支持泛型类型的解析和序列化。 5. 支持JSONPath:fastjson支持JSONPath表达式查询。 6. 支持...
- **泛型支持**:Fastjson支持Java泛型,可以自动识别并处理泛型集合和泛型Map。 - **自定义Map Key**:对于Map中的Key,Fastjson可以处理非String类型的Key,只要提供适当的序列化和反序列化策略。 7. **其他...
在使用`fastjson-1.2.5.jar`时,开发人员可以将这个JAR文件添加到项目的类路径中,然后通过import导入相应的类,即可开始使用Fastjson提供的功能。例如: ```java import com.alibaba.fastjson.JSON; import ...
4. **Map操作**:对于Map对象,Fastjson能够轻松地进行JSON和Map之间的转换,支持泛型Map。 5. **流式解析和生成**:Fastjson提供了一种高效的流式解析和生成方式,适用于大数据量处理,可以有效节省内存。 **二、...
处理复杂的JSON格式并将其转换为Java对象是一项常见的任务,这涉及到JSON库的使用,例如Jackson、Gson或Fastjson等。本资源提供了一个关于如何将复杂JSON转换为Java对象的学习实例,包括源码和可执行的jar包。 一、...
它支持各种复杂的Java类型,包括自定义类、泛型、枚举等,并且提供了丰富的API来处理JSON数据,比如`parseObject()`用于将JSON字符串解析为单个Java对象,`parse()`用于解析任意的JSON数据等。 在实际开发中,除了`...
例如,你可以定义一个`TypeReference`来处理泛型类型的转换: ```java List<User> users = JSON.parseArray(jsonString, new TypeReference<List<User>>() {}); ``` 另外,Fastjson还支持JSONPath,这是一种类似...
3. **类型安全**:Fastjson支持泛型,可以确保类型安全,避免运行时类型转换错误。 4. **JSONPath支持**:类似于XPath用于XML,JSONPath提供了一种在JSON结构中查询数据的方式,方便数据提取。 5. **流式API**:对于...
2. **泛型支持**:能够处理带有泛型的Java类,如`List<User>`。 3. **自定义序列化/反序列化**:可以通过实现`SerializerFeature`和`DeserializerFeature`来自定义对象的序列化和反序列化规则。 4. **过滤器**:使用...
- 数据类型转换:`TypeReference`类用于处理泛型类型转换,`JSONPath`类提供了JSONPath查询功能。 5. **使用示例** ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; ...
4. **自动类型推断**:Fastjson能够自动识别并处理Java对象中的泛型,无需额外配置。 5. **流式处理**:支持流式处理,适用于大数据量的场景,减少内存消耗。 三、Fastjson使用示例 1. **JSON字符串转Java对象** ...
- **TypeReference**:在处理泛型类型时,由于 Java 的类型擦除,FastJson 使用 TypeReference 来保存原始的类型信息,从而在反序列化时能正确恢复泛型类型。 此外,FastJson 还支持 JSONPath,这是一种类似于 ...
6. **自动转换**:Fastjson可以自动识别JavaBean的字段,并将其转换为JSON,反之亦然。同时,它还支持自定义转换规则,满足个性化需求。 7. **JSONPath支持**:Fastjson提供了类似XPath的JSONPath表达式,方便对...
Fastjson还支持许多高级特性,如JSONPath表达式用于查询JSON对象,支持Java 8日期/时间API,以及对泛型的支持等。同时,它还提供了一些工具类,如`JSONArray`, `JSONObject`, `JSONPObject`等,方便处理JSON数据。 ...
**Fastjson 深度解析与使用指南** Fastjson 是阿里巴巴开源的一款高性能的 JSON 库,它具有极快的解析速度和简洁的 API 设计,广泛应用于 Java 开发中。在本文中,我们将深入探讨 Fastjson 的核心特性、基本用法、...
- 支持Java泛型:可以处理各种类型的Java对象,包括泛型集合和自定义类。 - JSONPath支持:可以使用类似于XPath的语法来查询JSON数据。 - 自动类型转换:Fastjson能自动识别并转换JSON中的日期、枚举等类型。 7....
它支持 Java 泛型、自定义序列化类、任意复杂对象以及预先存在的无法修改的对象。 #### 二、获取与集成 - **下载 jar 包**: - 最新版本 jar 包可直接从 Maven 中央仓库下载,例如版本 1.2.53 的链接为:`...
3. **类型匹配**:尽量避免使用泛型,因为泛型在运行时会被擦除,可能会影响类型转换的准确性。 综上所述,FastJSON以其高效、易用的特性,成为了Java开发中处理JSON数据的首选工具之一。无论是在简单的对象转换...