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

推荐阅读
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文详细解析了Java中hashCode()和equals()方法的实现原理及其在哈希表结构中的应用,探讨了两者之间的关系及其实现时需要注意的问题。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 本题要求在一个长度为n的数组中找出任意一个重复的数字。数组中的所有数字都在0到n-1之间,但具体哪些数字重复以及重复次数未知。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
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社区 版权所有