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去解析串,目的就是验证这个工具类是否解析的格式有问题,所以有疑问或者有问题的伙伴们及时沟通哈!

  • 相关阅读:
    Java异常处理和设计
    一次qps测试实践
    Alternate Task UVA
    Just Another Problem UVA
    Lattice Point or Not UVA
    Play with Floor and Ceil UVA
    Exploring Pyramids UVALive
    Cheerleaders UVA
    Triangle Counting UVA
    Square Numbers UVA
  • 原文地址:https://www.cnblogs.com/wx_blog/p/9985200.html
Copyright © 2011-2022 走看看