Spring Boot 中使用 ObjectMapper 进行 JSON 序列化和反序列化

这篇具有很好参考价值的文章主要介绍了Spring Boot 中使用 ObjectMapper 进行 JSON 序列化和反序列化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是 ObjectMapper

在 Java 中,可以使用各种 JSON 序列化和反序列化工具将 Java 对象转换为 JSON 字符串或者将 JSON 字符串转换为 Java 对象。其中,Jackson 库是比较常用的 JSON 序列化和反序列化工具之一,它提供了 ObjectMapper 类,用于将 Java 对象转换为 JSON 字符串,或者将 JSON 字符串转换为 Java 对象。

ObjectMapper 可以将 Java 对象转换为 JSON 字符串的方法有很多,比如 writeValueAsStringwriteValue 等。其中,writeValueAsString 方法会将 Java 对象转换为 JSON 字符串并返回,而 writeValue 方法则会将 Java 对象转换为 JSON 字符串并输出到指定的输出流中。同样,ObjectMapper 也提供了很多方法用于将 JSON 字符串转换为 Java 对象,比如 readValuereadTree 等。

ObjectMapper 的使用

在Spring Boot 中,可以通过注入 ObjectMapper 对象来使用它提供的各种方法进行 JSON 序列化和反序列化。下面,演示如何使用 ObjectMapper 对象将一个 Java 对象序列化为 JSON 字符串,并将其返回给客户端。

@RestController
@RequestMapping("/api")
public class UserController {
    @Autowired
    private ObjectMapper objectMapper;

    @GetMapping("/user/{id}")
    public ResponseEntity<String> getUserById(@PathVariable Long id) throws JsonProcessingException {
        // 根据id查询用户信息
        User user = userService.getUserById(id);

        // 将用户信息序列化为JSON字符串
        String jsonStr = objectMapper.writeValueAsString(user);

        // 将JSON字符串返回给客户端
        return ResponseEntity.ok(jsonStr);
    }
}

在这个例子中,定义了一个 UserController 类,其中注入了一个 ObjectMapper 对象。在 getUserById 方法中,根据传入的 id 值查询了一个用户信息,并将该用户信息序列化为 JSON 字符串。最后,将序列化后的 JSON 字符串返回给客户端。

需要注意的是,在使用 ObjectMapper 进行序列化时,需要处理可能会抛出 JsonProcessingException 异常。这个异常通常是由于序列化过程中出现了错误,比如找不到序列化器、序列化器配置错误等。

在序列化过程中,如果需要对某些字段进行特殊处理,比如忽略某些字段、格式化日期字段等,可以通过创建一个 JsonSerializer 对象,并将其注册到 ObjectMapper 中来实现。具体的代码如下:

public class UserSerializer extends JsonSerializer<User> {
    @Override
    public void serialize(User user, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("username", user.getUsername());
        gen.writeNumberField("age", user.getAge());
        gen.writeStringField("gender", user.getGender());
        gen.writeEndObject();
    }
}

@RestController
@RequestMapping("/api")
public class UserController {
    @Autowired
    private ObjectMapper objectMapper;

    @GetMapping("/user/{id}")
    public ResponseEntity<String> getUserById(@PathVariable Long id) throws JsonProcessingException {
        // 根据id查询用户信息
        User user = userService.getUserById(id);

        // 注册自定义序列化器
        SimpleModule module = new SimpleModule();
        module.addSerializer(User.class, new UserSerializer());
        objectMapper.registerModule(module);

        //在这个例子中,创建了一个名为 `UserSerializer` 的自定义序列化器,继承了 `JsonSerializer<User>` 类,并实现了其 `serialize` 方法。在 `serialize` 方法中,重写了序列化逻辑,只序列化了 `username`、`age`、`gender` 三个字段,并将它们写入到 JSON 对象中。接着,在 `getUserById` 方法中,将自定义序列化器注册到 `ObjectMapper` 中,以便在序列化 `User` 对象时使用。

除了使用 `ObjectMapper` 对象进行序列化之外,还可以使用 `ObjectMapper` 对象进行反序列化。具体的代码如下:

```java
@RestController
@RequestMapping("/api")
public class UserController {
    @Autowired
    private ObjectMapper objectMapper;

    @PostMapping("/user")
    public ResponseEntity<User> createUser(@RequestBody String jsonStr) throws IOException {
        // 将JSON字符串反序列化为User对象
        User user = objectMapper.readValue(jsonStr, User.class);

        // 保存用户信息
        userService.saveUser(user);

        // 返回用户信息
        return ResponseEntity.ok(user);
    }
}

在这个例子中,定义了一个 createUser 方法,用于创建一个新的用户。在该方法中,使用 @RequestBody 注解将客户端传来的 JSON 字符串转换为一个 User 对象,使用 objectMapper.readValue 方法实现反序列化。接着,将反序列化后的 User 对象保存到数据库中,并将该对象返回给客户端。

需要注意的是,在使用 ObjectMapper 进行反序列化时,需要处理可能会抛出 IOException 异常。这个异常通常是由于反序列化过程中出现了错误,比如无法解析 JSON 字符串、反序列化器配置错误等。

在反序列化过程中,如果需要对某些字段进行特殊处理,比如解析日期字段、忽略某些字段等,可以通过创建一个 JsonDeserializer 对象,并将其注册到 ObjectMapper 中来实现。

TypeReference 的使用

除了将 Java 对象序列化为 JSON 字符串之外,还可以将 JSON 字符串反序列化为一个 Map 对象。在使用 ObjectMapper 进行反序列化时,可以使用 readValue 方法将 JSON 字符串转换为一个通用的 JsonNode 对象,然后使用 JsonNode 对象的方法对其进行操作。但是,如果需要将 JSON 字符串转换为一个具体类型的 Map 对象,可以使用 TypeReference 类型来实现。

在使用 TypeReference 类型进行反序列化时,需要指定反序列化后的 Map 类型。具体的代码如下:

@RestController
@RequestMapping("/api")
public class UserController {
    @Autowired
    private ObjectMapper objectMapper;

    @GetMapping("/users")
    public ResponseEntity<List<User>> getUsers() throws IOException {
        // 查询用户信息列表
        List<User> userList = userService.getUserList();

        // 将用户信息列表序列化为JSON字符串
        String jsonStr = objectMapper.writeValueAsString(userList);

        // 将JSON字符串反序列化为List<User>对象
        List<User> users = objectMapper.readValue(jsonStr, new TypeReference<List<User>>() {});

        // 返回用户信息列表
        return ResponseEntity.ok(users);
    }
}

在这个例子中,定义了一个 getUsers 方法,用于获取用户列表。在该方法中,先查询了一个用户信息列表,并将该列表序列化为 JSON 字符串。接着,使用 objectMapper.readValue 方法将 JSON 字符串转换为一个 List<User> 对象,使用 new TypeReference<List<User>>() 来指定反序列化后的类型。最后,将反序列化后的 List<User> 对象返回给客户端。

需要注意的是,在使用 TypeReference 进行反序列化时,需要处理可能会抛出 IOException 异常。此外,如果反序列化的 JSON 字符串中包含了一些不属于预期类型的字段,可能会抛出 MismatchedInputException 异常。

总结

本文介绍了如何在 Spring Boot 中使用 ObjectMapper 进行 JSON 序列化和反序列化,包括将 Java 对象序列化为 JSON 字符串、将 JSON 字符串反序列化为 Java 对象和将 JSON 字符串反序列化为 Map 对象。同时,还介绍了如何使用自定义序列化器和反序列化器以及如何使用 TypeReference 进行反序列化。希望本文能够帮助文章来源地址https://www.toymoban.com/news/detail-624207.html

到了这里,关于Spring Boot 中使用 ObjectMapper 进行 JSON 序列化和反序列化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot进阶(61):【技巧大揭秘】FastJson序列化遇到部分属性丢失?这里有一招优雅解决!

            一提到FastJson,就没有不清楚它为何物的,毕竟FastJson出自一位阿里工程师所开源的一款JSON解析器和生成器(反序列化与序列化组件),几乎所有项目都有它的身影,起码我开发过的九点九成项目都有用到它...         此刻,于是乎很多同学便开始脑补了,作者难道今

    2024年02月08日
    浏览(33)
  • 在Unity中使用Protobuf进行序列化

    目录 1.介绍 1.1 什么是Protobuf 1.2 Protobuf和其他数据序列化方案对比 2.下载Protobuf 2.1 方案一 使用VS的Nuget包管理器进行安装(推荐) 2.1.1安装Protobuff包 2.1.2拷贝.dll文件 2.2 方案二 从Github下载并自己生成.dll 2.2.1 下载Probuff 2.2.2 VS打开解决方案 2.2.3 安装.NET SDK 2.2.4 生成.dll文件 3

    2024年04月12日
    浏览(34)
  • C++使用boost::serialization进行序列化

    发现一个比较好玩的东西,boost::serialization序列化操作,简单来说感觉像ofstream和ifstream的升级版,Boost.Serialization 库能够将c++项目中的对象转换为一序列的比特(bytes),用来保存和加载还原对象。 在ORBSLAM3保存和加载地图的时候好像就是采用的这种方法,后面需要再深入研究

    2024年02月08日
    浏览(36)
  • 细谈使用CodeQL进行反序列化链的挖掘过程

    学习了一下CodeQL的各种使用方式,决定使用CodeQL细谈一下CC链挖掘,通过一步一步的朝着我们既定的目标进行靠近,最终成功的找到了一条鸡肋的二次反序列化的入口 CodeQL本身包含两部分解析引擎+  SDK  。 解析引擎用来解析我们编写的规则,虽然不开源,但是我们可以直接

    2024年02月05日
    浏览(23)
  • 协议,序列化,反序列化,Json

    协议究竟是什么呢?首先得知道主机之间的网络通信交互的是什么数据,像平时使用聊天APP聊天可以清楚,用户看到的不仅仅是聊天的文字,还能够看到用户的头像昵称等其他属性。也就可以证明网络通信不仅仅是交互字符串那么简单。事实上网络通信还可能会通过一个结构

    2024年02月13日
    浏览(29)
  • 协议定制 + Json序列化反序列化

    1.1 结构化数据 协议是一种 “约定”,socket api的接口, 在读写数据时,都是按 “字符串” 的方式来发送接收的。如果我们要传输一些\\\"结构化的数据\\\" 怎么办呢? 结构化数据: 比如我们在QQ聊天时,并不是单纯地只发送了消息本身,是把自己的头像、昵称、发送时间、消息本身

    2024年02月09日
    浏览(35)
  • 快速上手Flask(三) 在 Flask应用中使用Flask-SQLAlchemy(flask SQLAlchemy模型对象如何json序列化输出)

    常见情况下对于只有一个 Flask 应用,所有您需要做的事情就是创建 Flask 应用,选择加载配置接着创建 SQLAlchemy 对象时候把 Flask 应用传递给它作为参数。 官网:https://www.sqlalchemy.org/ 参考本人 文章:python常用库之数据库orm框架之SQLAlchemy 官方文档: 中文: http://www.pythondoc.co

    2024年01月25日
    浏览(46)
  • nlohmann::json 超简单序列化反序列化

    2024年01月20日
    浏览(31)
  • iOS处理json,序列化和反序列化

    Mantle 是一个开源的 Objective-C 框架,用于在 iOS 和 macOS 应用程序中实现模型层的序列化和反序列化。它提供了一种简单而强大的方式来将 JSON数据格式转换为自定义的数据模型对象,以及将数据模型对象转换为字典或 JSON 格式。 Mantle具有如下特点 自动映射 Mantle自动将 JSON 数据

    2024年02月11日
    浏览(52)
  • rust学习-json的序列化和反序列化

    由于 serde 库默认使用 JSON 格式进行序列化和反序列化 因此程序将使用 JSON 格式对数据进行序列化和反序列化 JSON:广泛使用的 JavaScript 对象符号,用于许多 HTTP API Postcard:no_std 和嵌入式系统友好的紧凑二进制格式。 CBOR:用于小消息大小且无需版本协商的简洁二进制对象表示

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包