1. 核心依赖
spring boot 默认集成 jackson,无需额外依赖:
<!-- 如果使用 spring boot starter web --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency>
2. 基础用法
2.1 对象转 json(序列化)
objectmapper mapper = new objectmapper(); user user = new user("张三", 25); string json = mapper.writevalueasstring(user); // 输出:{"name":"张三","age":25}
2.2 json 转对象(反序列化)
string json = "{\"name\":\"李四\",\"age\":30}"; user user = mapper.readvalue(json, user.class);
3. 常用注解
3.1 字段控制
public class user { @jsonproperty("user_name") // 自定义json字段名 private string name; @jsonignore // 忽略字段 private string password; @jsoninclude(jsoninclude.include.non_null) // 非空时序列化 private string email; }
3.2 时间格式
public class order { @jsonformat(pattern = "yyyy-mm-dd hh:mm:ss", timezone = "gmt+8") private localdatetime createtime; }
3.3 多态处理
@jsontypeinfo(use = id.name, property = "type") @jsonsubtypes({ @type(value = cat.class, name = "cat"), @type(value = dog.class, name = "dog") }) public abstract class animal {}
4. 自定义配置(spring boot)
4.1 全局配置
@configuration public class jacksonconfig { @bean public objectmapper objectmapper() { return new objectmapper() .disable(serializationfeature.write_dates_as_timestamps) // 日期不转时间戳 .enable(deserializationfeature.accept_empty_string_as_null_object) .setserializationinclusion(jsoninclude.include.non_null); } }
4.2 配置项示例
# application.yml spring: jackson: date-format: yyyy-mm-dd hh:mm:ss time-zone: gmt+8 default-property-inclusion: non_null deserialization: fail_on_unknown_properties: false # 忽略未知字段
5. 高级技巧
5.1 处理泛型
typereference<resultdto<list<user>>> typeref = new typereference<>() {}; resultdto<list<user>> result = mapper.readvalue(json, typeref);
5.2 流式 api(处理大文件)
jsonfactory factory = mapper.getfactory(); try (jsonparser parser = factory.createparser(new file("large.json"))) { while (parser.nexttoken() != null) { // 逐条处理 } }
5.3 自定义序列化器
public class moneyserializer extends jsonserializer<bigdecimal> { @override public void serialize(bigdecimal value, jsongenerator gen, serializerprovider provider) { gen.writestring(value.setscale(2, roundingmode.half_up) + "元"); } } // 使用注解 public class product { @jsonserialize(using = moneyserializer.class) private bigdecimal price; }
6. 常见问题解决
6.1 循环引用问题
// 方法1:使用 @jsonignore 打断循环 public class order { @jsonignore private user user; } // 方法2:配置全局忽略 mapper.configure(serializationfeature.fail_on_self_references, false);
6.2 枚举处理
public enum status { @jsonvalue // 序列化时使用 code ok(1), error(2); private final int code; // 反序列化时根据 code 转换 @jsoncreator public static status fromcode(int code) { /* ... */ } }
6.3 处理特殊字符
mapper.configure(jsongenerator.feature.escape_non_ascii, true); // 输入:{"name":"张三"} → 输出:{"name":"\u5f20\u4e09"}
7. 性能优化
7.1 启用缓存
mapper.enable(mapperfeature.use_annotations); mapper.enable(mapperfeature.can_override_access_modifiers);
7.2 线程安全配置
objectmapper mapper = new objectmapper(); // 配置为线程安全 mapper.registermodule(new javatimemodule()); mapper.configure(serializationfeature.write_dates_as_timestamps, false);
7.3 使用第三方模块
<dependency> <groupid>com.fasterxml.jackson.datatype</groupid> <artifactid>jackson-datatype-jsr310</artifactid> </dependency>
objectmapper mapper = new objectmapper().registermodule(new javatimemodule());
8. 安全注意事项
8.1 防止 xxe 攻击
mapper.configure(jsonparser.feature.allow_external_processing, false);
8.2 反序列化防护
// 启用类型检查 mapper.enabledefaulttyping(objectmapper.defaulttyping.non_final); // 或使用注解 @jsontypeinfo
最佳实践总结
- 统一配置:通过 objectmapper 全局配置确保一致性
- 合理使用注解:避免过度注解导致代码污染
- 性能监控:对高频接口进行序列化性能测试
- 版本管理:及时升级 jackson 版本修复漏洞
通过以上方法,可以高效安全地处理 json 数据。
到此这篇关于使用jackson进行json生成与解析的新手指南的文章就介绍到这了,更多相关jackson处理json内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论