详细分析Java中的ObjectMapper基本知识(附Demo)

目录

  • 1. 基本知识
  • 2. 基本操作
    • 2.1 转换Java对象为JSON
    • 2.2 转换JSON为Java对象
  • 3. 拓展

1. 基本知识

ObjectMapper 是 Jackson 数据处理库中的核心类之一,主要用于将 Java 对象转换为 JSON 和将 JSON 转换为 Java 对象

Jackson 是当前最流行的 JSON 处理库之一,提供了灵活且高效的 JSON 序列化与反序列化机制,推荐阅读:详细分析Java中的@JsonSerialize注解

主要功能:

  • 序列化 (Serialization):将 Java 对象转换为 JSON 字符串
  • 反序列化 (Deserialization):将 JSON 字符串转换为 Java 对象
  • 读取和写入:ObjectMapper 可以将 JSON 直接读取到 Java 对象,或将 Java 对象直接写入文件

2. 基本操作

2.1 转换Java对象为JSON

转换Java对象为JSON,称为 序列化

import com.fasterxml.jackson.databind.ObjectMapper;public class ObjectMapperExample {public static void main(String[] args) {ObjectMapper objectMapper = new ObjectMapper();// 创建一个示例对象Person person = new Person("John", 30);try {// 将 Java 对象转换为 JSON 字符串String jsonString = objectMapper.writeValueAsString(person);System.out.println("序列化后的JSON字符串: " + jsonString);} catch (Exception e) {e.printStackTrace();}}
}class Person {private String name;private int age;// 构造器public Person(String name, int age) {this.name = name;this.age = age;}// Getters 和 Setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

writeValueAsString() 方法将对象序列化为 JSON 字符串
通过 Person 类中的 getter 和 setter 方法,Jackson 自动提取对象中的字段值

截图如下:

在这里插入图片描述

2.2 转换JSON为Java对象

正确代码如下:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;public class ObjectMapperExample {public static void main(String[] args) {ObjectMapper objectMapper = new ObjectMapper();String jsonString = "{\"name\":\"John\",\"age\":30}";try {// 将 JSON 字符串反序列化为 Person 对象Person person = objectMapper.readValue(jsonString, Person.class);System.out.println("反序列化后的Person对象: " + person.getName() + ", " + person.getAge());} catch (Exception e) {e.printStackTrace();}}
}class Person {private String name;private int age;// 使用 @JsonCreator 注解的构造器@JsonCreatorpublic Person(@JsonProperty("name") String name, @JsonProperty("age") int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

截图如下:

在这里插入图片描述


对于这种需要注意如下点:

  • 为 Person 类添加一个无参构造器
  • 或者使用 Jackson 提供的注解 来告诉 Jackson 使用特定的构造器进行反序列化

Jackson 反序列化时,通常需要一个无参构造器,除非显式使用了其它反序列化策略。因此,简单地为 Person 类添加一个无参构造器可以解决这个问题

class Person {private String name;private int age;// 无参构造器public Person() {}// 全参构造器public Person(String name, int age) {this.name = name;this.age = age;}// Getters 和 Setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

如果不希望使用无参构造器,或者类设计不允许,可以使用 Jackson 的 @JsonCreator 注解,明确指定哪个构造器用于反序列化

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;class Person {private String name;private int age;// 使用 @JsonCreator 注解指定构造器用于反序列化@JsonCreatorpublic Person(@JsonProperty("name") String name, @JsonProperty("age") int age) {this.name = name;this.age = age;}// Getters 和 Setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

3. 拓展

常用方法如下:

  • writeValueAsString(Object obj):将对象序列化为 JSON 字符串
  • writeValue(File file, Object obj):将对象序列化并写入文件
  • readValue(String content, Class<T> valueType):将 JSON 字符串反序列化为 Java 对象
  • readValue(File src, Class<T> valueType):从文件中读取 JSON,并反序列化为 Java 对象

高级用法如下:

1. 自定义序列化与反序列化
Jackson 提供了注解如 @JsonSerialize 和 @JsonDeserialize,可以自定义对象的序列化和反序列化过程,例如:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;@JsonSerialize(using = CustomPersonSerializer.class)
@JsonDeserialize(using = CustomPersonDeserializer.class)
public class Person {private String name;private int age;// 构造器、getter、setter 省略
}

2. 处理复杂的 JSON 结构
对于嵌套结构或者集合,可以使用泛型,如 List<T> 或 Map<String, Object> 来处理

import com.fasterxml.jackson.core.type.TypeReference;public class ObjectMapperExample {public static void main(String[] args) {ObjectMapper objectMapper = new ObjectMapper();String jsonString = "[{\"name\":\"John\",\"age\":30}, {\"name\":\"Jane\",\"age\":25}]";try {// 反序列化为 List<Person>List<Person> people = objectMapper.readValue(jsonString, new TypeReference<List<Person>>(){});people.forEach(person -> System.out.println(person.getName() + ", " + person.getAge()));} catch (Exception e) {e.printStackTrace();}}
}
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;public class ObjectMapperExample {public static void main(String[] args) {ObjectMapper objectMapper = new ObjectMapper();// 示例 1: Java对象序列化为JSON字符串Person person = new Person("John", 30);try {// 将 Java 对象序列化为 JSONString jsonString = objectMapper.writeValueAsString(person);System.out.println("序列化后的JSON字符串: " + jsonString);} catch (Exception e) {e.printStackTrace();}// 示例 2: 将JSON字符串反序列化为Java对象String json = "{\"name\":\"Jane\",\"age\":25}";try {// 将 JSON 字符串反序列化为 Java 对象Person deserializedPerson = objectMapper.readValue(json, Person.class);System.out.println("反序列化后的Person对象: " + deserializedPerson.getName() + ", " + deserializedPerson.getAge());} catch (Exception e) {e.printStackTrace();}// 示例 3: 处理嵌套JSON结构 (List)String jsonArray = "[{\"name\":\"John\",\"age\":30}, {\"name\":\"Jane\",\"age\":25}]";try {// 反序列化为 List<Person>List<Person> people = objectMapper.readValue(jsonArray, new TypeReference<List<Person>>(){});for (Person p : people) {System.out.println("姓名: " + p.getName() + ", 年龄: " + p.getAge());}} catch (Exception e) {e.printStackTrace();}}
}// Person 类定义
class Person {private String name;private int age;// 使用 @JsonCreator 注解指定构造器用于反序列化@JsonCreatorpublic Person(@JsonProperty("name") String name, @JsonProperty("age") int age) {this.name = name;this.age = age;}// Getters 和 Setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

截图如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/428376.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DOCKER 数据库管理软件自己开发--———未来之窗行业应用跨平台架构

- 数据异地容灾服务--未来之窗智慧数据服务 DATA REMOTE DISASTER RECOVERY SERVICE -CyberWin Future Docker-数据查看 CyberWin DATA Viewer 1.docker 样式 mysqli://root:密码172.17.0.2:端口/数据库 阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;…

mat (Eclipse Memory Analyzer Tool)使用以及详解

前言 在Java开发中&#xff0c;内存问题往往不易被发现&#xff0c;但它们可能导致应用性能下降甚至崩溃。Eclipse Memory Analyzer Tool&#xff08;MAT&#xff09;是一个强大的开源工具&#xff0c;专门用于分析Java堆转储&#xff08;heap dumps&#xff09;文件&#xff…

2024华为杯研赛E题保姆级教程思路分析

E题题目&#xff1a;高速公路应急车道紧急启用模型 今年的E题设计到图像/视频处理&#xff0c;实际上&#xff0c;E题的难度相对来说较低&#xff0c;大家不用畏惧视频的处理&#xff0c;被这个吓到。实际上&#xff0c;这个不难&#xff0c;解决了视频的处理问题&#xff0c;…

L3 逻辑回归

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 在周将使用 LogisticRegression 函数对经典的鸢尾花 (Iris) 数据集进行分类。将详细介绍逻辑回归的数学原理。 1. 逻辑回归的数学原理 逻辑回归是一种线性分…

如何短期提高品牌声量?说几个有效策略

在如今竞争激烈的市场环境中&#xff0c;品牌声量成为了衡量一个品牌市场影响力的关键指标。一个强大的品牌声量不仅可以增加品牌的可见度&#xff0c;还能有效提升品牌的市场竞争力。但是&#xff0c;如何有效提升品牌声量&#xff0c;成为很多企业面临的挑战。首先我们要明确…

R语言机器学习算法实战系列(二) SVM算法(Support Vector Machine)

文章目录 介绍原理应用方向下载数据加载R包导入数据数据预处理数据描述数据切割标准化数据设置参数训练模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性保存模型总结系统信息介绍 支持向量机(Support Vector Machine,简称SVM)是一种…

Django_Vue3_ElementUI_Release_004_使用nginx部署

1. nginx安装配置 1.1 下载nginx Download nginx 1.2 测试一下 1.3 进入nginx用命令操作 2. 部署 2.1 前端部署 2.1.1 修改nginx监听配置 …conf/nginx.conf http {... # 这里不进行修改server {listen 8010; # 监听 80 端口server_name 192.168.10.24; # 输入服务器 ip…

Matlab simulink建模与仿真 第十八章(Stateflow状态机)

参考视频&#xff1a;Simulink/stateflow的入门培训_哔哩哔哩_bilibili 一、概述 Stateflow是集成于Simulink中的图形化设计与开发工具&#xff0c;主要用于针对控制系统中的复杂控制逻辑进行建模与仿真&#xff0c;或者说&#xff0c;Stateflow适用于针对事件响应系统进行建模…

深度学习:(五)初识神经网络

&#xff08;一&#xff09;神经网络的层数 除去输入层&#xff0c;但包括输出层&#xff0c;每一层都有自己的参数。 输入层称为第零层。 &#xff08;二&#xff09;最简单的神经网络&#xff08;逻辑回归&#xff09; 下图中的小圆圈&#xff0c;代表了一种运算。且一个小…

基于深度学习的花卉智能分类识别系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 传统的花卉分类方法通常依赖于专家的知识和经验&#xff0c;这种方法不仅耗时耗力&#xff0c;而且容易受到主观因素的影响。本系统利用 TensorFlow、Keras 等深度学习框架构建卷积神经网络&#…

【第十三章:Sentosa_DSML社区版-机器学习聚类】

目录 【第十三章&#xff1a;Sentosa_DSML社区版-机器学习聚类】 13.1 KMeans聚类 13.2 二分KMeans聚类 13.3 高斯混合聚类 13.4 模糊C均值聚类 13.5 Canopy聚类 13.6 Canopy-KMeans聚类 13.7 文档主题生成模型聚类 13.8 谱聚类 【第十三章&#xff1a;Sentosa_DSML社…

环境搭建2(游戏逆向)

#include<iostream> #include<windows.h> #include<tchar.h> #include<stdio.h> #pragma warning(disable:4996) //exe应用程序 VOID PrintUI(CONST CHAR* ExeName, CONST CHAR* UIName, CONST CHAR* color, SHORT X坐标, SHORT y坐标, WORD UIwide, W…

硬件工程师笔试面试——开关

目录 11、开关 11.1 基础 开关原理图 开关实物图 11.1.1 概念 11.1.2 常见的开关类型及其应用 11.2 相关问题 11.2.1 开关的工作原理是什么? 11.2.2 在设计一个电子系统时,如何选择最适合的开关类型? 11.2.3 不同类型的开关在实际应用中有哪些优势和局限性? 11.…

AI+教育|拥抱AI智能科技,让课堂更生动高效

AI在教育领域的应用正逐渐成为现实&#xff0c;提供互动性强的学习体验&#xff0c;正在改变传统教育模式。AI不仅改变了传统的教学模式&#xff0c;还为教育提供了更多的可能性和解决方案。从个性化学习体验到自动化管理任务&#xff0c;AI正在全方位提升教育质量和效率。随着…

使用Renesas R7FA8D1BH (Cortex®-M85)实现多功能UI

目录 概述 1 系统框架介绍 1.1 模块功能介绍 1.2 UI页面功能 2 软件框架结构实现 2.1 软件框架图 2.1.1 应用层API 2.1.2 硬件驱动层 2.1.3 MCU底层驱动 2.2 软件流程图 4 软件功能实现 4.1 状态机功能核心代码 4.2 页面功能函数 4.3 源代码文件 5 功能测试 5.1…

基于多域名,通过云运营商弹性负载,Nginx配置等基于的多租户系统部署

已经开发好久的系统&#xff0c;因为业务上没有需求&#xff0c;没有做上线部署&#xff0c;此系统为多租户系统&#xff0c;原来设计是通过租户码参数来识别的&#xff0c;每个租户访问&#xff0c;需要传自己的码过来&#xff0c;才能确定是哪个租户登录系统&#xff0c; 今…

nacos和eureka的区别详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Nacos 和 Eureka 是两种服务注册与发现的组件&#xff0c;它们在微服务架构中扮演重要角色。两者虽然都是为了解决服务发现的问题&#xff0c;但在功能特性、架构、设计理念等方面有很多不同。以下是详细的…

C++——map和set的使用以及map系列

目录 map和set的使用 1. 序列式容器和关联式容器 2. set系列的使⽤ 2.1 set和multiset参考⽂档 2.2 set类的介绍 2.3 set的构造和迭代器 2.4 set的增删查 set的增删查关注以下⼏个接⼝即可&#xff1a; 2.6 find和erase使⽤样例&#xff1a; lower_bound(); upper_bo…

如何选择OS--Linux不同Distribution的选用

写在前言&#xff1a; 刚写了Windows PC的不同editions的选用&#xff0c;趁热&#xff0c;把Linux不同的Distribution选用也介绍下&#xff0c;希望童鞋们可以了解-->理解-->深入了解-->深入理解--...以致于能掌握特定版本的Linux的使用甚者精通。……^.^…… so&a…

项目文件配置

1. 参数配置化 1.1 问题分析 1.2 问题解决 Value 注解通常用于外部配置的属性注入&#xff0c;具体用法为&#xff1a;Value("${配置文件中的key}") 2. yml配置文件 2.1 SpringBoot提供了多种属性配置方式 2.2 常见配置文件格式对比 2.3 yml 基本语法 大小写敏…