《JSON笔记之二》----封装JSONUtil

时间:2022-07-24
本文章向大家介绍《JSON笔记之二》----封装JSONUtil,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

许多java开发人员对于fastjson再也熟悉不过了,这是alibaba开源的依赖,使用fastjson可以使我们很容易的把请求json串转换成为我们所需要的对象、list、map等对象格式,对于开发带来了很多的遍历,具体的详细操作就不详细介绍了。

下面进入我们的正题,最近开发项目和学习中封装了一个JSONUtil类,使用也挺方便,所以就给大家分享一下吧!

package cn.itwx.mybatis.common;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
//import com.sun.istack.internal.Nullable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.lang.Nullable;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @author: qxy
 * @create: 2018-04-24 17:20
 **/
public class JsonUtils {

    public static final ObjectMapper mapper = new ObjectMapper();

    private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class);

    /**
     * 将对象转换成json格式
     * @param obj
     * @return
     */
    @Nullable
    public static String serialize(Object obj) {
        if (obj == null) {
            return null;
        }
        if (obj.getClass() == String.class) {
            return (String) obj;
        }
        try {
            return mapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            logger.error("json序列化出错:" + obj, e);
            return null;
        }
    }

    /**
     * 将json转换成对象的格式
     * @param json
     * @param tClass
     * @param <T>
     * @return
     */
    @Nullable
    public static <T> T parse(String json, Class<T> tClass) {
        try {
            return mapper.readValue(json, tClass);
        } catch (IOException e) {
            logger.error("json解析出错:" + json, e);
            return null;
        }
    }

    /**
     * 将一个json转换成list
     * @param json
     * @param eClass
     * @param <E>
     * @return
     */
    @Nullable
    public static <E> List<E> parseList(String json, Class<E> eClass) {
        try {
            return mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, eClass));
        } catch (IOException e) {
            logger.error("json解析出错:" + json, e);
            return null;
        }
    }

    /**
     * 将json解析成map
     * @param json
     * @param kClass
     * @param vClass
     * @param <K>
     * @param <V>
     * @return
     */
    @Nullable
    public static <K, V> Map<K, V> parseMap(String json, Class<K> kClass, Class<V> vClass) {
        try {
            return mapper.readValue(json, mapper.getTypeFactory().constructMapType(Map.class, kClass, vClass));
        } catch (IOException e) {
            logger.error("json解析出错:" + json, e);
            return null;
        }
    }

    /**
     * 解析复杂类型的json串,适用以上所有的格式
     * @param json
     * @param type
     * @param <T>
     * @return
     */
    @Nullable
    public static <T> T nativeRead(String json, TypeReference<T> type) {
        try {
            return mapper.readValue(json, type);
        } catch (IOException e) {
            logger.error("json解析出错:" + json, e);
            return null;
        }
    }
}

2、为了验证json解析格式是否正确,所以我专门在这个类里面定义一个内部类和方法验证,附上源代码,有兴趣的小伙伴们可以亲自操作一下。

对于这段代码中可能会有小伙伴对于@Data、@Nullable@NoArgsConstructor等注解会感到困惑,这些事lombok的注解方式,有兴趣或者技术大佬可以下面留言大家一些说下他的用法,这里小编先不叙述了,等待详解哦

public class JsonUtils {

  ......//省去上面的封装方法

    //内部类
    @Data   //次注解可以省去类中的setget方法
    @NoArgsConstructor//注解无参构造
    @AllArgsConstructor//有参构造
    static class User{
        String name;
        int age;
    }
//定义的主方法
    public static void main(String[] args) {
        User user = new User("lisi",23);
        //json序列化:将对象转换为json串
        String json = serialize(user);
        System.out.println("json="+json);

        //json反序列化:将json串转换成对象
        User parse = parse(json, User.class);
        System.out.println("user=" + parse);

        //将json转换成对象list
        String json = "[12,23,63,64]";
        List<Integer> integers = parseList(json, Integer.class);
        System.out.println("list="+integers);
        String userJson = "[{"name":"lisi","age":21},{"name":"ahua","age":32},{"name":"llk","age":23}]";
        //自定义JOSNUtil工具类
        List<User> users = parseList(userJson, User.class);
        System.out.println("users=" + users);
        //使用JSON类
        List<User> userList = JSON.parseArray(userJson, User.class);
        System.out.println("userList =" + userList);
        //使用JSON的子类,JSONArray
        List<User> list = JSONArray.parseArray(userJson, User.class);
        System.out.println("List = "+ list);

        //将json转换成map
        //language=JSON
        String json = "{"name":"Jack","age":"23"}";
        Map<String, String> map = parseMap(json, String.class, String.class);
        System.out.println("map:"+map);


        //json串为map复杂类型
        //language=JSON
        String json = "[{"name":"ROSE","age":"32"},{"name":"jack","sex":"m"}]";
        List<Map<String, String>> maps = nativeRead(json, new TypeReference<List<Map<String, String>>>() {
        });//匿名内部类

        //循环List
        for (Map<String ,String> map : maps){
            System.out.println("map="+map);
        }
}

细心的小伙伴们可能会发现我同时用了fastjson去解析串,目的就是验证这个工具类是否解析的格式有问题,所以有疑问或者有问题的伙伴们及时沟通哈!