Jackson的使用与创建Jackson工具类

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.1 Jackson常用注解

注解说明
@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<String, Object> any() { return map; }

1.2 Jackson的简单应用

添加pom.xml配置信息:

<!-- Jackson依赖 -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.9.9</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.9</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.9.9</version>
</dependency>

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

示例要求:

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

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

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

package com.pjb.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.Date;

/**
 * 用户信息实体类
 * @author pan_junbiao
 **/
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;

    //省略getter与setter方法...
}

1.2.1 将实体类转换为JSON

import com.fasterxml.jackson.databind.ObjectMapper;

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

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

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

执行结果:

1.2.2 将JSON转换为实体类

import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 将JSON转换为实体类
 * @author pan_junbiao
 */
@Test
public void jsonToEntity() throws Exception
{
    //JSON内容
    String json = "{\n" +
            "\t\"userName\": \"pan_junbiao的博客\",\n" +
            "\t\"password\": \"123456\",\n" +
            "\t\"blogUrl\": \"https://blog.csdn.net/pan_junbiao\",\n" +
            "\t\"blog-remark\": \"您好,欢迎访问 pan_junbiao的博客\",\n" +
            "\t\"createDate\": \"2020-05-30 16:18:28\"\n" +
            "}";

    //将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工具类

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

package com.pjb.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Jackson工具类
 * @author pan_junbiao
 **/
public class JacksonUtil
{
    private static ObjectMapper mapper = new ObjectMapper();

    /**
     * 将对象转换成JSON数据
     * @param data 对象
     * @return JSON数据
     */
    public static String getBeanToJson(Object data)
    {
        try
        {
            String result = mapper.writeValueAsString(data);
            return result;
        }
        catch (JsonProcessingException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将JSON数据转换成对象
     * @param jsonData JSON数据
     * @param beanType 对象类型
     * @return 对象
     */
    public static <T> T getJsonToBean(String jsonData, Class<T> beanType)
    {
        try
        {
            T result = mapper.readValue(jsonData, beanType);
            return result;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将JSON数据转换成列表
     * @param jsonData JSON数据
     * @param beanType 对象类型
     * @return 列表
     */
    public static <T> List<T> getJsonToList(String jsonData, Class<T> beanType)
    {
        try
        {
            JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, beanType);
            List<T> resultList = mapper.readValue(jsonData, javaType);
            return resultList;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

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

    /**
     * 将JSON数据转换成Map集合
     * @param jsonData JSON数据
     * @param keyType 键类型
     * @param valueType 值类型
     * @return Map集合
     */
    public static <K, V> Map<K, V> getJsonToMap(String jsonData, Class<K> keyType, Class<V> valueType)
    {
        try
        {
            JavaType javaType = mapper.getTypeFactory().constructMapType(Map.class, keyType, valueType);
            Map<K, V> resultMap = mapper.readValue(jsonData, javaType);
            return resultMap;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }
}

(1)将JSON数据转换成Set集合。

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

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

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

执行结果:

(2)将JSON数据转换成Map集合。

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

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

    //将JSON数据转换成Map集合
    Map<String, String> 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"));
}

执行结果:

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pan_junbiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值