热门标签 | 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;}}

推荐阅读
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 探索偶数次幂二项式系数的求和方法及其数学意义 ... [详细]
  • Python全局解释器锁(GIL)机制详解
    在Python中,线程是操作系统级别的原生线程。为了确保多线程环境下的内存安全,Python虚拟机引入了全局解释器锁(Global Interpreter Lock,简称GIL)。GIL是一种互斥锁,用于保护对解释器状态的访问,防止多个线程同时执行字节码。尽管GIL有助于简化内存管理,但它也限制了多核处理器上多线程程序的并行性能。本文将深入探讨GIL的工作原理及其对Python多线程编程的影响。 ... [详细]
  • 本文深入探讨了C#中的反射与特性功能。首先,介绍了反射的基本概念,即通过元数据(包括类的方法、属性和字段等)在运行时动态获取和操作程序信息的能力。此外,还详细解析了特性的使用方法及其在代码注解和元数据扩展中的重要作用,为开发者提供了丰富的编程技巧和实践指导。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文深入解析了Java面向对象编程的核心概念及其应用,重点探讨了面向对象的三大特性:封装、继承和多态。封装确保了数据的安全性和代码的可维护性;继承支持代码的重用和扩展;多态则增强了程序的灵活性和可扩展性。通过具体示例,文章详细阐述了这些特性在实际开发中的应用和优势。 ... [详细]
  • 在Java编程中,`AbstractClassTest.java` 文件详细解析了抽象类的使用方法。该文件通过导入 `java.util.*` 包中的 `Date` 和 `GregorianCalendar` 类,展示了如何在主方法 `main` 中实例化和操作抽象类。此外,还介绍了抽象类的基本概念及其在实际开发中的应用场景,帮助开发者更好地理解和运用抽象类的特性。 ... [详细]
  • AIX编程挑战赛:AIX正方形问题的算法解析与Java代码实现
    在昨晚的阅读中,我注意到了CSDN博主西部阿呆-小草屋发表的一篇文章《AIX程序设计大赛——AIX正方形问题》。该文详细阐述了AIX正方形问题的背景,并提供了一种基于Java语言的解决方案。本文将深入解析这一算法的核心思想,并展示具体的Java代码实现,旨在为参赛者和编程爱好者提供有价值的参考。 ... [详细]
  • 在Python多进程编程中,`multiprocessing`模块是不可或缺的工具。本文详细探讨了该模块在多进程管理中的核心原理,并通过实际代码示例进行了深入分析。文章不仅总结了常见的多进程编程技巧,还提供了解决常见问题的实用方法,帮助读者更好地理解和应用多进程编程技术。 ... [详细]
  • 本文介绍了如何利用Apache POI库高效读取Excel文件中的数据。通过实际测试,除了分数被转换为小数存储外,其他数据均能正确读取。若在使用过程中发现任何问题,请及时留言反馈,以便我们进行更新和改进。 ... [详细]
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
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社区 版权所有