热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用ObjectMapper实现JSON与JavaBean的高效转换

本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。

ObjectMapper 介绍:


Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml、文件等转换成Java对象。它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写。


Jackson主要包含了3个模块:


jackson-core
jackson-annotations
jackson-databind
其中,jackson-annotations依赖于jackson-core,jackson-databind又依赖于jackson-annotations。


Jackson有三种方式处理Json:


使用底层的基于Stream的方式对Json的每一个小的组成部分进行控制
使用Tree Model,通过JsonNode处理单个Json节点
使用databind模块,直接对Java对象进行序列化和反序列化
通常来说,我们在日常开发中使用的是第3种方式,有时为了简便也会使用第2种方式,比如你要从一个很大的Json对象中只读取那么一两个字段的时候,采用databind方式显得有些重,JsonNode反而更简单。


加入依赖

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.8.3</version></dependency>

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;public class ObjectMapperDemo {
public static void main(String[] args) throws Exception {/*testObj();*//*testList();*/testMap();}/*** 1.对象转json格式的字符串* 2.对象转字节数组* 3.json字符串转为对象* 4.byte数组转为对象 * &#64;throws Exception*/public static void testObj() throws Exception {//创建转换对象 使用默认的构造方法&#xff0c;使用的是JsonParsers和JsonGenerators映射ObjectMapper mapper&#61;new ObjectMapper();// 转换为格式化的jsonmapper.enable(SerializationFeature.INDENT_OUTPUT);// 如果json中有新增的字段并且是实体类类中不存在的&#xff0c;不报错mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);//创建学生对象Student stu&#61;new Student("ghl", 12, "123", "19845252&#64;qq.com");//1.对象转json格式的字符串String stuToString &#61; mapper.writeValueAsString(stu);//System.out.println("对象转为字符串&#xff1a;" &#43; stuToString);/** 输出结果&#xff1a;* 对象转为字符串&#xff1a;{"name" : "ghl","age" : 12,"password" : "123","email" : "19845252&#64;qq.com"}*///2.对象转字节数组byte[] byteArr &#61; mapper.writeValueAsBytes(stu);System.out.println("对象转为byte数组&#xff1a;" &#43; byteArr);/** 对象转为byte数组&#xff1a;[B&#64;6aaa5eb0*///3.json字符串转为对象Student student &#61; mapper.readValue(stuToString, Student.class);System.out.println("json字符串转为对象&#xff1a;" &#43; student);//json字符串转为对象&#xff1a;Student [name&#61;ghl, age&#61;12, password&#61;123, email&#61;19845252&#64;qq.com]//4.byte数组转为对象 Student student2 &#61; mapper.readValue(byteArr, Student.class);System.out.println("byte数组转为对象&#xff1a;" &#43; student2);//输出结果&#xff1a;byte数组转为对象&#xff1a;Student [name&#61;ghl, age&#61;12, password&#61;123, email&#61;19845252&#64;qq.com]mapper.writeValue(new File("D:/test.txt"), stu); // 写到文件中}/**list集合与json字符的转换* 1.集合转为字符串* 2.字符串转集合* &#64;throws Exception * */public static void testList() throws Exception {//创建转换对象 使用默认的构造方法&#xff0c;使用的是JsonParsers和JsonGenerators映射ObjectMapper mapper&#61;new ObjectMapper();// 转换为格式化的jsonmapper.enable(SerializationFeature.INDENT_OUTPUT);// 如果json中有新增的字段并且是实体类类中不存在的&#xff0c;不报错mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);List<Student> studnetList &#61; new ArrayList<Student>();studnetList.add(new Student("zs", 12, "121", "1584578878&#64;qq.com"));studnetList.add(new Student("lisi", 13, "122", "1584578878&#64;qq.com"));studnetList.add(new Student("wangwu", 14, "123", "1584578878&#64;qq.com"));studnetList.add(new Student("zhangliu", 15, "124", "1584578878&#64;qq.com"));//1.集合转为字符串String jsonStr &#61; mapper.writeValueAsString(studnetList);System.out.println("集合转为字符串&#xff1a;" &#43; jsonStr);/*輸出結果* 集合转为字符串&#xff1a;[ {"name" : "zs","age" : 12,"password" : "121","email" : "1584578878&#64;qq.com"}, {"name" : "lisi","age" : 13,"password" : "122","email" : "1584578878&#64;qq.com"}, {"name" : "wangwu","age" : 14,"password" : "123","email" : "1584578878&#64;qq.com"}, {"name" : "zhangliu","age" : 15,"password" : "124","email" : "1584578878&#64;qq.com"} ]* *///2.字符串转集合List<Student> userListDes &#61; mapper.readValue(jsonStr, List.class);System.out.println("字符串转集合&#xff1a;" &#43; userListDes);/*輸出結果* 字符串转集合&#xff1a;[{name&#61;zs, age&#61;12, password&#61;121, email&#61;1584578878&#64;qq.com}, * {name&#61;lisi, age&#61;13, password&#61;122, email&#61;1584578878&#64;qq.com}, * {name&#61;wangwu, age&#61;14, password&#61;123, email&#61;1584578878&#64;qq.com}, * {name&#61;zhangliu, age&#61;15, password&#61;124, email&#61;1584578878&#64;qq.com}]*/}/**Map与字符串转换* 1.Map转为字符串* 2.字符串转Map* &#64;throws Exception*/public static void testMap() throws Exception {//创建转换对象 使用默认的构造方法&#xff0c;使用的是JsonParsers和JsonGenerators映射ObjectMapper mapper&#61;new ObjectMapper();// 转换为格式化的jsonmapper.enable(SerializationFeature.INDENT_OUTPUT);// 如果json中有新增的字段并且是实体类类中不存在的&#xff0c;不报错mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);Map<String, Object> testMap &#61; new HashMap<String, Object>();testMap.put("name", "ghl");testMap.put("age", 18);//1.Map转为字符串String jsonStr &#61; mapper.writeValueAsString(testMap);System.out.println("Map转为字符串&#xff1a;" &#43; jsonStr);/** Map转为字符串&#xff1a;{"name" : "ghl","age" : 18}*///2.字符串转MapMap<String, Object> testMapDes &#61; mapper.readValue(jsonStr, Map.class);System.out.println("字符串转Map&#xff1a;" &#43; testMapDes);/** 字符串转Map&#xff1a;{name&#61;ghl, age&#61;18}*/}
}

工具类


import java.util.ArrayList;
import java.util.List;import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;public class JsonUtils {// 定义jackson对象private static final ObjectMapper MAPPER &#61; new ObjectMapper();/*** 将对象转换成json字符串&#xfffd;??*

Title: pojoToJson

*

Description:

* &#64;param data* &#64;return*/public static String objectToJson(Object data) {try {String string &#61; MAPPER.writeValueAsString(data);return string;} catch (JsonProcessingException e) {e.printStackTrace();}return null;}/*** 将json结果集转化为对象* * &#64;param jsonData json数据* &#64;param clazz 对象中的object类型* &#64;return*/public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {try {T t &#61; MAPPER.readValue(jsonData, beanType);return t;} catch (Exception e) {e.printStackTrace();}return null;}/*** 将json数据转换成pojo对象list*

Title: jsonToList

*

Description:

* &#64;param jsonData* &#64;param beanType* &#64;return*/
public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {JavaType javaType &#61; MAPPER.getTypeFactory().constructParametricType(List.class, beanType);try {List<T> list &#61; MAPPER.readValue(jsonData, javaType);return list;} catch (Exception e) {e.printStackTrace();}return null;}public static <T> T getJson(String jsonString, Class<T> cls) {T t &#61; null;try {t &#61; JSON.parseObject(jsonString, cls);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return t;}public static <T> List<T> getArrayJson(String jsonString, Class<T> cls) {List<T> list &#61; new ArrayList<T>();try {list &#61; JSON.parseArray(jsonString, cls);} catch (Exception e) {// TODO: handle exception}return list;}}

推荐阅读
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文详细介绍了Java中的输入输出(IO)流,包括其基本概念、分类及应用。IO流是用于在程序和外部资源之间传输数据的一套API。根据数据流动的方向,可以分为输入流(从外部流向程序)和输出流(从程序流向外部)。此外,还涵盖了字节流和字符流的区别及其具体实现。 ... [详细]
  • 本文详细介绍了在企业级项目中如何优化 Webpack 配置,特别是在 React 移动端项目中的最佳实践。涵盖资源压缩、代码分割、构建范围缩小、缓存机制以及性能优化等多个方面。 ... [详细]
author-avatar
迅驰代驾
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有