java工具类-jackson

工作中,接口与接口交互时,常常会将json和bean/list相互转化,来处理。本文基于jackson来封装工具

更多内容可以关注:iworkh博客

1.说明

如果没使用springboot的话,那么需要添加依赖,并初始化对象

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

如何在springboot中使用的,不用添加依赖,也可以不用自己实例化,使用spring容器已实例化的objectMapper,只要将对象交给容器管理,并注入对应的实列即可。
(当然了不用ioc容器的,自己创建一个实列也无可厚非)

2.工具类

主要以下几个方法

  • json转对象
  • 对象转json(json格式化)
  • json转化为泛型类型对象(集合等泛型方式)
package com.iworkh.test.restassured.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

/**
 * json转化工具类
 *
 * @author: iworkh-沐雨云楼
 * @date: 2020-06-18
 */
public class JacksonTool {

    private static final Logger LOGGER = LoggerFactory.getLogger(JacksonTool.class);

    private final static ObjectMapper mapper;

    static {
        mapper = new ObjectMapper();
        // 忽略json中在对象不存在对应属性
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        // 忽略空bean转json错误
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    }

    /**
     * json转对象
     *
     * @param jsonStr   json串
     * @param classType 对象类型
     * @return 对象
     */
    public static <T> T toEntity(String jsonStr, Class<T> classType) {

        if (StringUtils.isEmpty(jsonStr)) {
            LOGGER.warn("Json string {} is empty!", classType);
            return null;
        }

        try {
            return mapper.readValue(jsonStr, classType);
        } catch (IOException e) {
            LOGGER.error("json to entity error.", e);
        }
        return null;
    }

    /**
     * json转化为带泛型的对象
     *
     * @param jsonStr json字符串
     * @param typeReference 转化类型
     * @return 对象
     */
    public static <T> T toEntity(String jsonStr, TypeReference<T> typeReference) {
        if (StringUtils.isBlank(jsonStr) || typeReference == null) {
            return null;
        }
        try {
            return (T) mapper.readValue(jsonStr, typeReference);
        } catch (JsonProcessingException e) {
            LOGGER.error("json to entity error.", e);
        }
        return null;
    }

    /**
     * 对象转json
     *
     * @param obj 对象
     * @return json串
     */
    public static String toJson(Object obj) {
        if (obj instanceof String) {
            return (String) obj;
        }
        try {
            return mapper.writeValueAsString(obj);
        } catch (IOException e) {
            LOGGER.error("obj to json error.", e);
        }
        return null;
    }

    /**
     * 对象转json(格式化的json)
     *
     * @param obj 对象
     * @return 格式化的json串
     */
    public static String toJsonWithFormat(Object obj) {
        if (obj == null) {
            return null;
        }

        if (obj instanceof String) {
            return (String) obj;
        }

        try {
            return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
        } catch (IOException e) {
            LOGGER.error("obj to json error.", e);
        }
        return null;
    }
}

3.调用

使用很简单,主要注意下泛型对象的转化使用 new TypeReference<List<UserVo>>() {})

public class JacksonToolTest {

    @Test
    public void testEntityToJson() {
        String[] hobbies = {"football", "sing"};
        UserVo user = new UserVo(1, "iworkh", System.currentTimeMillis(), false, Arrays.asList(hobbies));
        String json = JacksonTool.toJson(user);
        System.out.println(json);
    }

    @Test
    public void testJsonToEntity() {
        String json = "{\"id\":1,\"name\":\"iworkh\",\"birthday\":1592575139578,\"vip\":false,\"hobbies\":[\"football\",\"sing\"]}";
        UserVo userVo = JacksonTool.toEntity(json, UserVo.class);
        if (userVo != null) {
            System.out.println(userVo.getName());
        }
    }


    @Test
    public void testListEntityToJson() {
        String[] hobbies = {"football", "sing"};
        UserVo user1 = new UserVo(1, "iworkh1", System.currentTimeMillis(), false, Arrays.asList(hobbies));
        UserVo user2 = new UserVo(2, "iworkh2", System.currentTimeMillis(), false, Arrays.asList(hobbies));
        ArrayList<UserVo> list = new ArrayList<>();
        list.add(user1);
        list.add(user2);
        String json = JacksonTool.toJson(list);
        System.out.println(json);
    }

    @Test
    public void testJsonToListEntity() {
        String json = "[{\"id\":1,\"name\":\"iworkh1\",\"birthday\":1592575376189,\"vip\":false,\"hobbies\":[\"football\",\"sing\"]}," + "{\"id\":2,\"name\":\"iworkh2\",\"birthday\":1592575376189,\"vip\":false,\"hobbies\":[\"football\",\"sing\"]}]";
        List<UserVo> userList = JacksonTool.toEntity(json, new TypeReference<List<UserVo>>() {
        });

        userList.forEach(item -> {
            System.out.println(item.getName());
        });
    }
}

更多内容可以关注:iworkh博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章