使用第三方库(推荐)
这是最主流且高效的方式,常用的库包括Gson、Jackson和FastJson等,它们通过注解或API将Java对象与JSON自动转换,极大简化了开发流程。
Gson库
- 特点:由Google开发,语法简洁,支持双向转换(对象↔JSON字符串/流),适合快速实现基础功能。
- 步骤:
- 添加Maven依赖:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.6</version> </dependency>
- 创建普通Java类并设置字段值:
public class User { private String name; private int age; // 必须有无参构造函数和getter/setter方法 public User(String name, int age) { this.name = name; this.age = age; } }
- 序列化为JSON字符串:
User user = new User("Alice", 30); Gson gson = new Gson(); String jsonStr = gson.toJson(user); // 输出: {"name":"Alice","age":30}
- 反序列化时可指定目标类型:
User newUser = gson.fromJson(jsonStr, User.class);
- 添加Maven依赖:
- 高级特性:可通过注解控制字段行为,例如
@SerializedName
修改键名,@Expose
决定是否导出特定字段。
- 步骤:
Jackson库
- 优势:功能更强大,支持复杂场景如泛型集合、日期格式化和自定义序列化规则,企业级应用首选。
- 典型用法:
- 引入依赖后配置ObjectMapper(核心类):
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.enable(SerializationFeature.INDENT_OUTPUT); // 美化输出格式 MyData data = ...; String prettyJson = objectMapper.writeValueAsString(data);
- 处理嵌套结构时表现优异,例如多层POJO间的关联关系自动解析。
- 引入依赖后配置ObjectMapper(核心类):
- 典型用法:
FastJson(阿里巴巴开源)
- 亮点:速度快、内存占用低,适合高并发场景,提供独特的TypeReference解决泛型擦除问题。
- 示例代码:
List<Map<String, Object>> list = new ArrayList<>(); String jsonList = JSON.toJSONString(list);
- 示例代码:
手动构建JSON文本(低层级控制)
若不想依赖第三方库,可直接拼接字符串或使用内置工具类生成合法JSON内容,但此方法缺乏类型检查,维护成本较高。
方法 | 示例代码 | 适用场景 |
---|---|---|
String拼接 | {"key": "value", "num": 123} |
简单固定结构的数据传递 |
StringBuilder动态组装 | 适用于多段落组合的大型JSON文档 | 需要精确控制每个字符的情况 |
org.json包的基础类 | new JSONObject().put("name", "Bob").toString() |
轻度交互且无需全量解析的场景 |
注意事项与最佳实践
- 命名规范:字段名建议采用驼峰式(camelCase),与JSON键对应时可通过注解调整大小写策略。
- 空值处理:多数库默认忽略null值,如需保留需额外配置(如Jackson的
include=NonNull.AS_NULL
)。 - 安全性考量:避免直接解析不可信来源的JSON数据,防止反序列化漏洞攻击,可启用安全模式限制输入范围。
- 性能优化:频繁调用的场景下复用Parser/Generator实例比每次新建更高效。
- 兼容性测试:不同库对特殊字符(Unicode)、日期格式的支持存在差异,跨系统交互前务必验证。
相关问答FAQs
Q1: 如果遇到循环引用导致栈溢出怎么办?
A: 这是对象图包含环状结构时的常见问题,解决方案包括:①使用@JsonIgnoreProperties
跳过特定属性;②启用Jackson的延迟加载机制(ObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
);③重构业务模型消除循环依赖。
Q2: 如何让JSON忽略某些敏感字段?
A: 主流方案有三种:①在类上添加@JsonIgnoreProperties({"password"})
注解;②使用transient关键字标记暂态字段;③通过混入接口(Mixin)动态排除字段。
interface SensitiveFilter { @JsonIgnore String getPassword(); } objectMapper.addMixIn(User.class, SensitiveFilter.class);
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/111196.html