将 JSON 字符串转化为对象的详细笔记 (Java示例)
1. 主流 JSON 库的选择
在 Java 中,常用以下库进行 JSON 和对象之间的转换:
- Jackson:Spring 默认集成,性能优异,支持流式解析。
- FastJSON:阿里开发,速度快,但需注意版本安全性。
- Gson:Google 维护,简单易用,语法简洁。
- JSON-B:Java 标准 API(需依赖库如 Eclipse Yasson)。
2. 基本步骤
无论是哪种库,通用的转化步骤如下:
-
引入依赖
在 Maven/Gradle 中添加对应 JSON 库的依赖。 -
定义目标类
创建 Java 类,属性与 JSON 字段对应(支持嵌套对象或数组)。 -
调用 API 转化
使用库的 API 将 JSON 字符串转为对象。
示例 1:使用 FastJSON
依赖引入(Maven)
<XML>
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.23</version>
</dependency>
代码实现
<JAVA>
public class User {private String name;private int age;// 字段名与 JSON 中的 key 一致(或使用 @JSONField 注解)// 需要 getter/setter
}// 示例 JSON 字符串
String jsonStr = "{\"name\": \"John\", \"age\": 30}";// 转换
User user = JSON.parseObject(jsonStr, User.class);
关键注解
@JSONField(name = "json_key")
:映射 JSON 字段名。
<JAVA>
public class WechatUser {@JSONField(name = "openid")private String openId;
}
示例 2:使用 Jackson
依赖引入(Spring Boot 默认包含)
<XML>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version>
</dependency>
代码实现
<JAVA>
ObjectMapper mapper = new ObjectMapper();// 将 JSON 转为对象
User user = mapper.readValue(jsonStr, User.class);// 处理复杂 JSON(如嵌套对象或数组)
String nestedJson = "{\"name\": \"John\", \"address\": {\"city\": \"Paris\"}}";
User user = mapper.readValue(nestedJson, User.class);
关键注解
@JsonProperty("json_key")
:映射 JSON 字段名。@JsonIgnore
:忽略字段。
示例 3:使用 Gson
依赖引入
<XML>
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.9</version>
</dependency>
代码实现
<JAVA>
Gson gson = new Gson();// JSON 转为对象
User user = gson.fromJson(jsonStr, User.class);// 处理复杂结构
List<User> users = gson.fromJson("[{\"name\": \"John\"}]", new TypeToken<List<User>>(){}.getType());
关键配置
@SerializedName("json_key")
:字段映射注解。
<JAVA>
public class WechatUser {@SerializedName("openid")private String openId;
}
3. 常见问题及解决
问题 1:字段名不匹配
- 场景:JSON 中的
openid
vs Java 类的openId
。 - 解决:
使用库的注解(如@JsonProperty
、@JSONField
、@SerializedName
)。
问题 2:缺少默认构造函数
- 报错:
No default constructor for XXX
. - 解决:确保类有一个无参构造器。
问题 3:处理日期格式
- 场景:JSON 中的日期字符串转为
LocalDateTime
。 - 解决:
自定义序列化/反序列化规则(如@JsonFormat
注解)。
<JAVA>
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
问题 4:嵌套对象或集合
- 示例 JSON:
<JSON>
{"name": "John","orders": [{"id": 1}, {"id": 2}] }
- 对象定义:
<JAVA>
public class User {private String name;private List<Order> orders; }public class Order {private int id; }
4. 安全性注意事项
- 避免反序列化漏洞:禁用
AutoType
特性(FastJSON 需设置ParserConfig.getGlobalInstance().setSafeMode(true);
)。 - 校验 JSON 来源:确保字符串来自可信接口,避免注入攻击。
5. 性能优化
- 缓存
ObjectMapper
或Gson
实例:避免重复创建。 - 使用流式 API:处理大 JSON 文件时,用
JsonParser
逐步解析(如 Jackson 的JsonFactory
)。
代码模板(通用)
<JAVA>
try {// 使用 JacksonObjectMapper mapper = new ObjectMapper();MyObject obj = mapper.readValue(jsonStr, MyObject.class);// 使用 GsonGson gson = new Gson();MyObject obj = gson.fromJson(jsonStr, MyObject.class);// 使用 FastJSONMyObject obj = JSON.parseObject(jsonStr, MyObject.class);
} catch (JsonProcessingException e) {// 处理格式错误
} catch (Exception e) {// 其他异常(如字段缺失)
}
通过掌握不同库的特性及常见问题处理,可高效完成 JSON 字符串到对象的转化,适用于 API 响应解析、配置文件读取等场景。