zoukankan      html  css  js  c++  java
  • Jackson泛型反序列化的5种方式

    package com.zsk.tool.json;
    
    
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.core.type.TypeReference;
    
    import com.fasterxml.jackson.databind.DeserializationFeature;
    import com.fasterxml.jackson.databind.JavaType;
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    import com.fasterxml.jackson.databind.node.ArrayNode;
    import com.fasterxml.jackson.databind.node.ObjectNode;
    import lombok.Data;
    import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
    
    import java.lang.reflect.Type;
    
    public class JsonUtil {
        /**
         * 线程安全,可全局使用
         */
        public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    
        static {
            //反序列化的时候如果多了其他属性,不抛出异常  
            OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    
            //如果是空对象的时候,不抛异常  
            OBJECT_MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    
            //属性为null不转换
            OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        }
    
        @Data
        static class ResponseData<T> {
            private int code;
            private String message;
            private T data;
        }
    
        static class ResponseData1 extends ResponseData<User> {
    
        }
    
        @Data
        static class User {
            private String name;
            private Integer age;
            private Boolean used;
        }
    
        public static void main(String[] args) throws Exception {
            serialize();
        }
    
        // 反序列化
        public static void deserialize() throws Exception {
            String json = "{\n" +
                    "  \"code\": 1,\n" +
                    "  \"message\": \"test message\",\n" +
                    "  \"data\": {\n" +
                    "    \"name\":\"zhang\",\n" +
                    "    \"age\":\"100\",\n" +
                    "    \"used\":true,\n" +
                    "    \"test\":\"sds\"\n" +
                    "  }\n" +
                    "}";
            // 泛型反序列化的5种方式
            // 方式1  -- 推荐1
            TypeReference<ResponseData<User>> type = new TypeReference<ResponseData<User>>() {
            };
            ResponseData<User> res1 = OBJECT_MAPPER.readValue(json, type);
    
            // 方式2 -- 推荐2 依次指定主体class,n个泛型class
            JavaType javaType1 = OBJECT_MAPPER.getTypeFactory().constructParametricType(ResponseData.class, User.class);
            ResponseData<User> res2 = OBJECT_MAPPER.readValue(json, javaType1);
    
            // 方式3 过时
            JavaType javaType2 = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(ResponseData.class,
                    ResponseData.class,
                    User.class);
            ResponseData<User> res3 = OBJECT_MAPPER.readValue(json, javaType2);
    
    
            // 方式4 
            Type[] types = new Type[1];
            types[0] = User.class;
            final ParameterizedTypeImpl type4 = ParameterizedTypeImpl.make(ResponseData.class, types,
                    ResponseData.class.getDeclaringClass());
            TypeReference<ResponseData> typeReference = new TypeReference<ResponseData>() {
                @Override
                public Type getType() {
                    return type4;
                }
            };
            ResponseData<User> res4 = OBJECT_MAPPER.readValue(json, typeReference);
    
            // 方式5 新建一个类指定泛型
            ResponseData1 res5 = OBJECT_MAPPER.readValue(json, ResponseData1.class);
    
            System.out.println("res1:" + res1);
            System.out.println("res2:" + res2);
            System.out.println("res3:" + res3);
            System.out.println("res4:" + res4);
            System.out.println("res5:" + res5);
    
            String data1 = "{\n" +
                    "  \"code\": 1,\n" +
                    "  \"message\": \"test message\",\n" +
                    "  \"data\": [\n" +
                    "    {\n" +
                    "      \"name\": \"zhang1\",\n" +
                    "      \"age\": \"100\",\n" +
                    "      \"used\": false,\n" +
                    "      \"test\": \"sds\"\n" +
                    "    },\n" +
                    "    {\n" +
                    "      \"name\": \"zhang2\",\n" +
                    "      \"age\": \"100\",\n" +
                    "      \"used\": false,\n" +
                    "      \"test\": \"sds\"\n" +
                    "    }\n" +
                    "  ]\n" +
                    "}";
            JsonNode root = OBJECT_MAPPER.readTree(data1);
            // get 没有返回null
            System.out.println(root.get("111"));
            // path 不会异常,没有返回空字符串
            System.out.println(root.path("111").asText().length());
    
            // 方式1 获取数组
            JsonNode node = root.path("data");
            if (node.isArray()) {
                for (JsonNode objNode : node) {
                    System.out.println(objNode);
                }
            }
            // 方式2 获取数组
            ArrayNode arrayNode = (ArrayNode) (root.get("data"));
            for (JsonNode jsonNode : arrayNode) {
                System.out.println(jsonNode);
            }
        }
    
        // 序列化成字符串
        public static void serialize() throws Exception {
            // ======================= alibaba
            JSONObject root = new JSONObject();
            root.put("code", 1);
            root.put("message", "test");
            JSONArray jsonArray = new JSONArray();
    
            jsonArray.add("test1");
            jsonArray.add("test2");
            jsonArray.add("test3");
            root.put("data", jsonArray);
    
            System.out.println(OBJECT_MAPPER.writeValueAsString(root));
    
            // ========================== jackson 
            ObjectNode root1 = OBJECT_MAPPER.createObjectNode();
            root1.put("code", 1);
            root1.put("message", "test");
            ArrayNode array1 = OBJECT_MAPPER.createArrayNode();
            ObjectNode element1 = OBJECT_MAPPER.createObjectNode();
            element1.put("name", "zhang");
            element1.put("age", 99);
            element1.put("used", true);
            array1.add(element1);
            root1.set("data", array1);
            System.out.println(OBJECT_MAPPER.writeValueAsString(root1));
    
        }
    }


    <jackson.version>2.10.3</jackson.version>

    <fastson.version>1.2.58</fastson.version>

    <!--Jackson-->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <!-- Jackson end -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.16</version>
    </dependency>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>${fastson.version}</version>
    </dependency>
  • 相关阅读:
    原型模式
    哈希表原理
    Pow共识算法
    C++虚函数的工作原理
    TCP三次握手与四次分手
    TCP重置报文段及RST常见场景分析
    Ping、Traceroute工作原理
    ARP协议
    Rust生命周期bound用于泛型的引用
    Linux下core dump
  • 原文地址:https://www.cnblogs.com/zincredible/p/15596403.html
Copyright © 2011-2022 走看看