> 技术文档 > 将 JSON 字符串转化为对象的详细笔记 (Java示例)_java json转对象

将 JSON 字符串转化为对象的详细笔记 (Java示例)_java json转对象


1. 主流 JSON 库的选择

在 Java 中,常用以下库进行 JSON 和对象之间的转换:

  • Jackson:Spring 默认集成,性能优异,支持流式解析。
  • FastJSON:阿里开发,速度快,但需注意版本安全性。
  • Gson:Google 维护,简单易用,语法简洁。
  • JSON-B:Java 标准 API(需依赖库如 Eclipse Yasson)。

2. 基本步骤

无论是哪种库,通用的转化步骤如下:

  1. 引入依赖
    在 Maven/Gradle 中添加对应 JSON 库的依赖。

  2. 定义目标类
    创建 Java 类,属性与 JSON 字段对应(支持嵌套对象或数组)。

  3. 调用 API 转化
    使用库的 API 将 JSON 字符串转为对象。


示例 1:使用 FastJSON

依赖引入(Maven)

 com.alibaba fastjson 2.0.23
代码实现

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 字段名。
public class WechatUser { @JSONField(name = \"openid\") private String openId;}

示例 2:使用 Jackson

依赖引入(Spring Boot 默认包含)

 com.fasterxml.jackson.core jackson-databind 2.13.3
代码实现

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

依赖引入

 com.google.code.gson gson 2.8.9
代码实现

Gson gson = new Gson();// JSON 转为对象User user = gson.fromJson(jsonStr, User.class);// 处理复杂结构List users = gson.fromJson(\"[{\\\"name\\\": \\\"John\\\"}]\", new TypeToken<List>(){}.getType());
关键配置
  • @SerializedName(\"json_key\"):字段映射注解。
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 注解)。
@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")private LocalDateTime createTime;
问题 4:嵌套对象或集合
  • 示例 JSON

    { \"name\": \"John\", \"orders\": [{\"id\": 1}, {\"id\": 2}]}
  • 对象定义

    public class User { private String name; private List orders;}public class Order { private int id;}

4. 安全性注意事项

  • 避免反序列化漏洞:禁用 AutoType 特性(FastJSON 需设置 ParserConfig.getGlobalInstance().setSafeMode(true);)。
  • 校验 JSON 来源:确保字符串来自可信接口,避免注入攻击。

5. 性能优化

  • 缓存 ObjectMapper 或 Gson 实例:避免重复创建。
  • 使用流式 API:处理大 JSON 文件时,用 JsonParser 逐步解析(如 Jackson 的 JsonFactory)。

代码模板(通用)

try { // 使用 Jackson ObjectMapper mapper = new ObjectMapper(); MyObject obj = mapper.readValue(jsonStr, MyObject.class); // 使用 Gson Gson gson = new Gson(); MyObject obj = gson.fromJson(jsonStr, MyObject.class); // 使用 FastJSON MyObject obj = JSON.parseObject(jsonStr, MyObject.class);} catch (JsonProcessingException e) { // 处理格式错误} catch (Exception e) { // 其他异常(如字段缺失)}

通过掌握不同库的特性及常见问题处理,可高效完成 JSON 字符串到对象的转化,适用于 API 响应解析、配置文件读取等场景。