zoukankan      html  css  js  c++  java
  • 《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: wx
     * @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   //次注解可以省去类中的set\get方法
        @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去解析串,目的就是验证这个工具类是否解析的格式有问题,所以有疑问或者有问题的伙伴们及时沟通哈!

  • 相关阅读:
    2017-2018 第一学期201623班《程序设计与数据结构》-第2&3周作业问题总结
    ## 2020春软件工程助教工作总结【第十周】
    【西北师大-20软工】第一次团队作业成绩汇总
    2020春软件工程助教工作总结【第八周】
    2020春软件工程助教工作总结【第六周】
    【西北师大-20软工】第三次作业成绩汇总
    2020春软件工程助教工作总结【第四周】
    2020春软件工程助教工作总结【第三周】
    2020春软件工程助教工作总结【第二周】
    2020春软件工程助教工作总结 【第一周】
  • 原文地址:https://www.cnblogs.com/wx_blog/p/9985200.html
Copyright © 2011-2022 走看看