当前位置: 代码网 > it编程>编程语言>Javascript > 使用Jackson进行JSON生成与解析的新手指南

使用Jackson进行JSON生成与解析的新手指南

2025年04月04日 Javascript 我要评论
1. 核心依赖spring boot 默认集成 jackson,无需额外依赖:<!-- 如果使用 spring boot starter web --><dependency>

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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com