百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

JSON工具之Jackson的使用详解

ztj100 2025-02-15 18:23 6 浏览 0 评论

1、Jackson的使用

Jackson 是当前用得比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一 。 Spring MVC 的默认 json 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快;Jackson 运行时占用内存比较低,性能比较好;Jackson 有灵活的 API,可以很容易进行扩展和定制。

1.1Jackson的常用注解

注解

说明

@JsonIgnore

使用@JsonIgnore注解JSON序列化时将忽略该字段。示例:

@JsonIgnore
private String password;

@JsonProperty

用于属性,把属性的名称序列化时转换为另外一个名称。示例:

@JsonProperty("blog-remark")

private String blogRemark;

@JsonFormat

用于属性或者方法,把属性的格式序列化时转换成指定的格式。示例:

@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date createDate;

@JsonPropertyOrder

用于类, 指定属性在序列化时 json 中的顺序 , 示例:
@JsonPropertyOrder({ "birth_Date", "name" })

public class Person

@JsonCreator

用于构造方法,和 @JsonProperty 配合使用,适用有参数的构造方法。 示例:
@JsonCreator
public Person(@JsonProperty("name")String name) {…}

@JsonAnySetter

用于属性或者方法,设置未反序列化的属性名和值作为键值存储到 map 中
@JsonAnySetter

public void set(String key, Object value) {

map.put(key, value);

}

@JsonAnyGetter

用于方法 ,获取所有未序列化的属性
public Map any() { return map; }

1.2Jackson的简单应用

添加pom.xml配置信息:



  com.fasterxml.jackson.core
  jackson-core
  2.9.9


  com.fasterxml.jackson.core
  jackson-databind
  2.9.9


  com.fasterxml.jackson.core
  jackson-annotations
  2.9.9

创建UserInfo(用户信息实体类),用户JSON序列化示例使用。

示例要求:

(1)使用@JsonIgnore注解,序列化时忽略登录密码字段。

(2)使用@JsonProperty注解,将blogRemark字段序列化时转换为blog-remark。

(3)使用@JsonFormat注解,序列化时将日期格式化。

package com.demo.utils.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

import java.util.Date;

/**
 * 用户信息实体类
 * @author luoxiang
 * @date 2022年01月13日 10:04 上午
 */
@Data
public class UserInfo
{
    /**
     * 用户名称
     */
    private String userName;

    /**
     * 登录密码
     * 使用@JsonIgnore注解
     * JSON序列化时将忽略该字段
     */
    @JsonIgnore
    private String password;

    /**
     * 博客地址
     */
    private String blogUrl;

    /**
     * 博客信息
     * 使用@JsonProperty注解
     * 把属性的名称序列化时转换为另外一个名称
     */
    @JsonProperty("blog-remark")
    private String blogRemark;

    /**
     * 创建时间
     * 使用@JsonFormat注解
     * 把属性的格式序列化时转换成指定的格式
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createDate;

}

1.2.1 将实体类转换为JSON

/**
 * 将实体类转换为JSON
 * @author luoxiang
 */
@Test
public void entityToJson() throws Exception {
    //用户信息实体类
    UserInfo userInfo = new UserInfo();
    userInfo.setUserName("uncle_xiang的博客");
    userInfo.setPassword("123456");
    userInfo.setBlogUrl("https://blog.csdn.net/uncle_xiang");
    userInfo.setBlogRemark("您好,欢迎访问 uncle_xiang的博客");
    userInfo.setCreateDate(new Date());

    //将参数转换成JSON对象
    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(userInfo);

    //打印结果
    System.out.println(json);
}

执行结果:

1.2.2 将JSON转换为实体类

/**
 * 将JSON转换为实体类
 * @author luoxiang
 */
@Test
public void jsonToEntity() throws Exception {
    //JSON内容
    String json = "{\"userName\":\"uncle_xiang的博客\",\"blogUrl\":\"https://blog.csdn.net/uncle_xiang\",\"createDate\":\"2022-01-13 10:07:55\",\"blog-remark\":\"您好,欢迎访问 uncle_xiang的博客\"}";

    //将JSON转换为实体类
    ObjectMapper mapper = new ObjectMapper();
    UserInfo  userInfo = mapper.readValue(json, UserInfo.class);

    //打印结果
    System.out.println("用户名称:" + userInfo.getUserName());
    System.out.println("登录密码:" + userInfo.getPassword());
    System.out.println("博客地址:" + userInfo.getBlogUrl());
    System.out.println("博客信息:" + userInfo.getBlogRemark());
    System.out.println("创建时间:" + userInfo.getCreateDate());
}

执行结果:

2、创建工具类

在项目中创建Jackson工具类(JacksonUtil.java)

package com.demo.utils.json;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Jackson工具类
 * @author luoxiang
 * @date 2022年01月13日 10:13 上午
 */
public class JacksonUtil {

    private static ObjectMapper mapper = new ObjectMapper();

    /**
     * 将对象转换成JSON数据
     * @author luoxiang
     * @date 2022/1/13 10:15 上午
     * @param data   data对象
     * @return java.lang.String  JSON数据
     */
    public static String getBeanToJson(Object data){
        try {
            return mapper.writeValueAsString(data);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将JSON数据转换成对象
     * @author luoxiang
     * @date 2022/1/13 10:17 上午
     * @param jsonData  JSON数据
     * @param beanType  对象类型
     * @return T 对象
     */
    public static  T getJsonToBean(String jsonData,Class beanType){
        try {
            return mapper.readValue(jsonData, beanType);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将JSON数据转换成列表
     * @author luoxiang
     * @date 2022/1/13 10:21 上午
     * @param jsonData JSON对象
     * @param beanType 对象类型
     * @return java.util.List 列表
     */
    public static  List getJsonToList(String jsonData, Class beanType){
        try {
            JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, beanType);
            return mapper.readValue(jsonData, javaType);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将JSON数据转换成Set集合
     * @param jsonData JSON数据
     * @param elementType  元素类型
     * @param 
     * @return Set集合
     */
    public static  Set getJsonToSet(String jsonData, Class elementType){
        try {
            JavaType javaType = mapper.getTypeFactory().constructCollectionType(Set.class, elementType);
            return mapper.readValue(jsonData,javaType);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将JSON数据转换成Map集合
     * @author luoxiang
     * @date 2022/1/13 10:28 上午
     * @param jsonData JSON数据
     * @param keyType  键类型
     * @param valueType 值类型
     * @return java.util.Map Map集合
     */
    public static  Map getJsonToMap(String jsonData, Class keyType, Class valueType){
        try {
            JavaType javaType = mapper.getTypeFactory().constructMapType(Map.class, keyType, valueType);
            return mapper.readValue(jsonData,javaType);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

1.1将JSON数据转换成set集合。

/**
 * 将JSON数据转换成Set集合
 * @author luoxiang
 */
@Test
public void setTest(){
    Set userSet = new HashSet<>();
    userSet.add("uncle_xiang的博客");
    userSet.add("您好,欢迎访问 uncle_xiang的博客");
    userSet.add("https://blog.csdn.net/uncle_xiang");

    //将Set转化为JSON数据
    String json = JacksonUtil.getBeanToJson(userSet);
    System.out.println(json + "\n");

    //将JSON数据转换成Set集合
    Set jsonToSet = JacksonUtil.getJsonToSet(json,String.class);
    for(String item : jsonToSet) {
        System.out.println(item);
    }
}

执行结果:

2.2将JSON数据转换成Map集合。

/**
 * 将JSON数据转换成Map集合
 * @author luoxiang
 */
@Test
public void mapTest() {
    Map userMap = new HashMap<>();
    userMap.put("userName", "uncle_xiang的博客");
    userMap.put("blogUrl", "https://blog.csdn.net/uncle_xiang");
    userMap.put("blogRemark", "您好,欢迎访问 uncle_xiang的博客");

    //将map转化为JSON数据
    String json = JacksonUtil.getBeanToJson(userMap);

    //将JSON数据转换成Map集合
    Map jsonToMap = JacksonUtil.getJsonToMap(json, String.class, String.class);
    System.out.println("用户名称:" + jsonToMap.get("userName"));
    System.out.println("博客地址:" + jsonToMap.get("blogUrl"));
    System.out.println("博客备注:" + jsonToMap.get("blogRemark"));
}

执行结果:

相关推荐

从IDEA开始,迈进GO语言之门(idea got)

前言笔者在学习GO语言编程的时候,GO语言在国内还没有像JAVA/Php/Python那样普及,绕了不少的弯路,要开始入门学习一门编程语言,最好就先从选择一个好的编程语言的开发环境开始,有了这个开发环...

基于SpringBoot+MyBatis的私人影院java网上购票jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于SpringBoot...

基于springboot的个人服装管理系统java网上商城jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...

基于springboot的美食网站Java食品销售jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...

贸易管理进销存springboot云管货管账分析java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目描述贸易管理进销存spring...

SpringBoot+VUE员工信息管理系统Java人员管理jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍SpringBoot+V...

目前见过最牛的一个SpringBoot商城项目(附源码)还有人没用过吗

帮粉丝找了一个基于SpringBoot的天猫商城项目,快速部署运行,所用技术:MySQL,Druid,Log4j2,Maven,Echarts,Bootstrap...免费给大家分享出来前台演示...

SpringBoot+Mysql实现的手机商城附带源码演示导入视频

今天为大家带来的是基于SpringBoot+JPA+Thymeleaf框架的手机商城管理系统,商城系统分为前台和后台、前台用的是Bootstrap框架后台用的是SpringBoot+JPA都是现在主...

全网首发!马士兵内部共享—1658页《Java面试突击核心讲》

又是一年一度的“金九银十”秋招大热门,为助力广大程序员朋友“面试造火箭”,小编今天给大家分享的便是这份马士兵内部的面试神技——1658页《Java面试突击核心讲》!...

SpringBoot数据库操作的应用(springboot与数据库交互)

1.JDBC+HikariDataSource...

SpringBoot 整合 Flink 实时同步 MySQL

1、需求在Flink发布SpringBoot打包的jar包能够实时同步MySQL表,做到原表进行新增、修改、删除的时候目标表都能对应同步。...

SpringBoot + Mybatis + Shiro + mysql + redis智能平台源码分享

后端技术栈基于SpringBoot+Mybatis+Shiro+mysql+redis构建的智慧云智能教育平台基于数据驱动视图的理念封装element-ui,即使没有vue的使...

Springboot+Mysql舞蹈课程在线预约系统源码附带视频运行教程

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的Springboot+Mysql舞蹈课程在线预约系统,系统项目源代码在【猿来入此】获取!https://www.yuan...

SpringBoot+Mysql在线众筹系统源码+讲解视频+开发文档(参考论文

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的在线众筹管理系统,主要实现了普通用户在线参与众筹基本操作流程的全部功能,系统分普通用户、超级管理员等角色,除基础脚手架外...

Docker一键部署 SpringBoot 应用的方法,贼快贼好用

这两天发现个Gradle插件,支持一键打包、推送Docker镜像。今天我们来讲讲这个插件,希望对大家有所帮助!GradleDockerPlugin简介...

取消回复欢迎 发表评论: