4大Json工具詳細使用說明

前言

Json在項目開發中使用的太多了,各種關於Json的依賴也是不斷地額退出,JackJson net.sf.json 以及阿里巴巴的Json,下面的將我實際項目中對於他們的使用做個介紹 。

1、解釋和依賴

我這裏按照我接觸的先後順序進行

1.1、net.sf.json

最開始接觸的就是它,非常神奇,不用找任何博客就能熟練使用,但是後來借出了JsonNode之後,比較之後二者差的不是一點在使用過程中


        <!--net.sf.json-->
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
        <!--net/sf/json/JSONObject-->
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib-ext-spring</artifactId>
            <version>1.0.2</version>
        </dependency>
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
        <!--net/sf/ezmorph/Morpher-->
        <dependency>
            <groupId>net.sf.ezmorph</groupId>
            <artifactId>ezmorph</artifactId>
            <version>1.0.6</version>
        </dependency>
        <!--org/apache/commons/collections/map/ListOrderedMap-->
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.2</version>
        </dependency>
        <!--org/apache/commons/beanutils/DynaBean -->
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.8.3</version>
        </dependency>

1.2、jackson

它就沒必要解釋了,用的最多的就是它


        <!-- Jackson jsonUtils-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>jackson-annotations</artifactId>
                    <groupId>com.fasterxml.jackson.core</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-parameter-names</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jdk8</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </dependency>

1.3、fastjson

這個我使用的不多,在序列化的時候使用過,一般沒使用過

<com-alibaba-fastjson.version>1.2.58</com-alibaba-fastjson.version>

<!--  fastjson  -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>${com-alibaba-fastjson.version}</version>
</dependency>

1.4、gson

這個在小米知道fastjson有一些問題的時候,使用gson進行替換

<gson.verson>2.8.5</gson.verson>

<!--gson-->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>${gson.verson}</version>
</dependency>

準備

package com.healerjean.proj.a_test.json;

import com.google.common.collect.Lists;
import com.healerjean.proj.a_test.json.JsonDemoDTO.User;

import com.healerjean.proj.util.json.JsonUtils;
import lombok.Data;
import lombok.experimental.Accessors;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * @author HealerJean
 * @ClassName JsonDemoDTO
 * @date 2019/10/29  16:22.
 * @Description
 */
@Data
@Accessors(chain = true)
public class JsonDemoDTO {

    private String reqSn;
    private int code;
    private String msg;
    private Date transDate;
    private Integer integer;
    private BigDecimal bigDecimal;
    private User user;
    private List<String> strList;
    private List<Company> companys;

    @Data
    @Accessors(chain = true)
    public static class Company {
        private Long companyId;
        private String companyName;
    }

    @Data
    @Accessors(chain = true)
    public static class User {
        private Long userId;
        private String userName;
    }


    public static JsonDemoDTO jsonDemo() {
        JsonDemoDTO jsonDemoDTO = new JsonDemoDTO();
        jsonDemoDTO.setReqSn(UUID.randomUUID().toString().replace("-", ""));
        jsonDemoDTO.setMsg("Success");
        jsonDemoDTO.setCode(200);
        jsonDemoDTO.setTransDate(new Date());
        jsonDemoDTO.setBigDecimal(new BigDecimal(100));
        jsonDemoDTO.setInteger(100);
        jsonDemoDTO.setStrList(Arrays.asList(new String[]{"奔馳", "寶馬"}));
        jsonDemoDTO.setUser(new User().setUserId(1L).setUserName("HealerJean"));
        List<Company> companies = Arrays.asList(new Company[]{
                new Company().setCompanyId(1L).setCompanyName("汽車公司"),
                new Company().setCompanyId(2L).setCompanyName("房產公司")});
        jsonDemoDTO.setCompanys(companies);
        return jsonDemoDTO;
    }

    public static String jsonString() {
        String json = JsonUtils.toJsonString(jsonDemo());
        return json;
    }

    public static void main(String[] args) {
        System.out.println(jsonString());
    }
}


1、net.sf.json

1.1、JSONObject的獲取數據以及基本使用

1.1.1、從JSONObject中獲取簡單數據

1.1.2、JSONArray中獲取 JSONObject對象

1.1.3、判斷JSONObject是否是數組,是否存在節點

1.1.4、簡單遍歷 JSONObject

1.1.5、遍歷JSONArray

1.1.5.1.、遍歷正常JSONArray
1.1.5.2、遍歷String集合的JSONArray


    /**
     * JsonObject的基本使用
     * 1、從JSONObject中獲取簡單數據
     * 2、JSONArray中獲取 JSONObject對象
     * 3、判斷JSONObject是否是數組,是否存在節點
     * 4、簡單遍歷 JSONObject
     * 5.1.、遍歷正常JSONArray
     * 5.2、遍歷String集合的JSONArray
     */
    @Test
    public void test1() {

        String json = JsonDemoDTO.jsonString();
        log.info("jsonString:【 {} 】", json);
        JSONObject jsonObject = JSONObject.fromObject(json);

        //1、從JSONObject中獲取簡單數據
        log.info("------------------------------------------------");
        log.info("1、從JSONObject中獲取簡單數據");
        String msg = jsonObject.getString(CommonConstants.msg);
        Integer code = jsonObject.getInt(CommonConstants.code);
        JSONObject userJsonObject = jsonObject.getJSONObject(CommonConstants.user);
        JSONArray companyJSONArray = jsonObject.getJSONArray(CommonConstants.companys);
        JSONArray strJsonArrayy = jsonObject.getJSONArray(CommonConstants.strList);
        log.info("msg:【 {} 】", msg);
        log.info("code:【 {} 】", code);
        log.info("userJsonObject:【 {} 】", userJsonObject);
        log.info("companyJsonArray:【 {} 】", companyJSONArray);
        log.info("strJsonArrayy:【 {} 】", strJsonArrayy);

        // 2、JSONArray中獲取 JSONObject對象
        log.info("------------------------------------------------");
        log.info("2、JSONArray中獲取 JSONObject對象");
        JSONObject company0 = companyJSONArray.getJSONObject(0);
        log.info("company0:【 {} 】", company0);
        // 雖然有下面這個方法,但是也要看情況是否能用,下面的會報錯,因爲不是一個JsonObject數據
        // 報錯信息net.sf.json.JSONException: JSONArray[0] is not a JSONObject.
        // JSONObject str0 = jsonObject.getJSONArray(CommonConstants.strList).getJSONObject(0);
        // log.info("str0:【 {} 】", str0);


        // 3、判斷JSONObject是否是數組,是否存在節點
        log.info("------------------------------------------------");
        log.info("3、判斷JSONObject是否是數組,是否存在節點");
        Boolean flagArray = companyJSONArray.isArray();
        Boolean flagHas = jsonObject.has(CommonConstants.msg);
        Boolean flagContainsKey = jsonObject.containsKey(CommonConstants.msg);
        log.info("flagArray:【 {} 】", flagArray);
        log.info("flag:【 {} 】", flagHas);
        log.info("flagContainsKey:【 {} 】", flagContainsKey);

        //4、簡單遍歷 JSONObject
        log.info("------------------------------------------------");
        log.info("4、簡單遍歷 JSONObject");
        for (Object key : jsonObject.keySet()) {
            Object value = jsonObject.get(key);
            log.info("key:【 {} 】,value:【 {} 】", key, value);
        }

        //5.1.、遍歷正常JSONArray
        log.info("------------------------------------------------");
        log.info("5.1.、遍歷正常JSONArray");
        Iterator iteratorCompany = companyJSONArray.iterator();
        while (iteratorCompany.hasNext()) {
            Object object = iteratorCompany.next();
            log.info("object:【 {} 】", object);
        }
        
}







// jsonString:【 {"reqSn":"58ed7f656bf1415c884bdd1a0a653dc7","code":200,"msg":"Success","transDate":1572354378560,"integer":100,"bigDecimal":100,"user":{"userId":1,"userName":"HealerJean"},"strList":["奔馳","寶馬"],"companys":[{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}]} 】 [38]
//         ------------------------------------------------ [42]
// 1、從JSONObject中獲取簡單數據 [43]
// msg:【 Success 】 [49]
// code:【 200 】 [50]
// userJsonObject:【 {"userId":1,"userName":"HealerJean"} 】 [51]
// companyJsonArray:【 [{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}] 】 [52]
// strJsonArrayy:【 ["奔馳","寶馬"] 】 [53]
//         ------------------------------------------------ [56]
// 2、JSONArray中獲取 JSONObject對象 [57]
// company0:【 {"companyId":1,"companyName":"汽車公司"} 】 [59]
//         ------------------------------------------------ [67]
// 3、判斷JSONObject是否是數組,是否存在節點 [68]
// flagArray:【 true 】 [72]
// flag:【 true 】 [73]
// flagContainsKey:【 true 】 [74]
//         ------------------------------------------------ [77]
// 4、簡單遍歷 JSONObject [78]
// key:【 reqSn 】,value:【 58ed7f656bf1415c884bdd1a0a653dc7 】 [81]
// key:【 code 】,value:【 200 】 [81]
// key:【 msg 】,value:【 Success 】 [81]
// key:【 transDate 】,value:【 1572354378560 】 [81]
// key:【 integer 】,value:【 100 】 [81]
// key:【 bigDecimal 】,value:【 100 】 [81]
// key:【 user 】,value:【 {"userId":1,"userName":"HealerJean"} 】 [81]
// key:【 strList 】,value:【 ["奔馳","寶馬"] 】 [81]
// key:【 companys 】,value:【 [{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}] 】 [81]
//         ------------------------------------------------ [85]
// 5.1.、遍歷正常JSONArray [86]
// object:【 {"companyId":1,"companyName":"汽車公司"} 】 [90]
// object:【 {"companyId":2,"companyName":"房產公司"} 】 [90]
//         ------------------------------------------------ [95]
// 5.2、遍歷String集合的JSONArray [96]
// object:【 奔馳 】 [100]
// object:【 寶馬 】 [100]

1.2、添加和刪除字段

1.2.1、基本數據、日期,對象,集合數據添加

1.2.2、JSONObject放入一個JSONObject

1.2.3、兩個JSONObject 合併爲一個

1.2.4、刪除某個節點

/**
     * 2、添加和刪除字段
     * 1、正常數據添加
     * 2、JSONObject放入一個JSONObject
     * 3、兩個JSONObject 合併爲一個
     */
    @Test
    public void add() {
        // 1、正常數據添加
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("reqSn", UUID.randomUUID().toString().replace("-", ""));
        jsonObject.put("msg", "Success");
        jsonObject.put("code", 200);
        jsonObject.put("transDate", new Date());
        jsonObject.put("strList", Arrays.asList(new String[]{"奔馳", "寶馬"}));
        jsonObject.put("user", new JsonDemoDTO.User().setUserId(1L).setUserName("HealerJean"));
        jsonObject.put("companys", Arrays.asList(new JsonDemoDTO.Company[]{
                new JsonDemoDTO.Company().setCompanyId(1L).setCompanyName("汽車公司"),
                new JsonDemoDTO.Company().setCompanyId(2L).setCompanyName("房產公司")}));
        log.info("jsonObject_1 :【 {} 】", jsonObject);


        // 2、JSONObject放入一個JSONObject
        JSONObject fieldJsonObject = new JSONObject();
        fieldJsonObject.put("key", "Str");
        jsonObject.put("fieldJsonObject", fieldJsonObject);
        log.info("2、JSONObject放入一個JSONObject :【 {} 】", jsonObject);


        // 3、兩個JSONObject 合併爲一個
        JSONObject userJsonObject = new JSONObject();
        // 4、刪除某個節點
        jsonObject.remove("user");
        userJsonObject.put("user", new JsonDemoDTO.User().setUserId(1L).setUserName("HealerJean"));
        jsonObject.putAll(userJsonObject);
        log.info("3、兩個JSONObject 合併爲一個 :【 {} 】", jsonObject);

    }

1.3、複雜JSONObject遍歷

/**
     * 3、 複雜JSONObject遍歷
     */
    @Test
    public void test3() {
        String json = JsonDemoDTO.jsonString();
        log.info("jsonString:【 {} 】", json);
        JSONObject jsonObject = JSONObject.fromObject(json);

        //1、獲取Json的key集合
        for (Object key : jsonObject.keySet()) {
            //2、獲取某個Key的值
            Object value = jsonObject.get(key);

            //2、判斷是對象-JSONObject嗎?
            if (value instanceof JSONObject) {
                log.info("key 【 {} 】, JSONObject對象 :【 {} 】", key, value);
            }
            //3、判斷是數組-JSONArray 嗎?
            else if (value instanceof JSONArray) {
                //4、數組迭代
                Iterator it = ((JSONArray) value).iterator();
                while (it.hasNext()) {
                    Object object = it.next();
                    if (object instanceof JSONObject) {
                        log.info("數組中的JSONObject :【 {} 】", value);
                    } else {
                        log.info("普通數組 :【 {} 】", value);
                    }
                }
                //7、 普通元素
            } else {
                log.info("key 【 {} 】, 普通元素 :【 {} 】", key, value);
            }
        }

    }
    
    
    
    
  jsonString:【 {"reqSn":"337017699e4c46daaeaa22e48f304017","code":200,"msg":"Success","transDate":1572354757185,"integer":100,"bigDecimal":100,"user":{"userId":1,"userName":"HealerJean"},"strList":["奔馳","寶馬"],"companys":[{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}]} 】 com.healerjean.proj.a_test.json.netSfJson.D01NetSfJson.test3[172]
key 【 reqSn 】, 普通元素 :【 337017699e4c46daaeaa22e48f304017 】 com.healerjean.proj.a_test.json.netSfJson.D01NetSfJson.test3[198]
key 【 code 】, 普通元素 :【 200 】 com.healerjean.proj.a_test.json.netSfJson.D01NetSfJson.test3[198]
key 【 msg 】, 普通元素 :【 Success 】 com.healerjean.proj.a_test.json.netSfJson.D01NetSfJson.test3[198]
key 【 transDate 】, 普通元素 :【 1572354757185 】 com.healerjean.proj.a_test.json.netSfJson.D01NetSfJson.test3[198]
key 【 integer 】, 普通元素 :【 100 】 com.healerjean.proj.a_test.json.netSfJson.D01NetSfJson.test3[198]
key 【 bigDecimal 】, 普通元素 :【 100 】 com.healerjean.proj.a_test.json.netSfJson.D01NetSfJson.test3[198]
key 【 user 】, JSONObject對象 :【 {"userId":1,"userName":"HealerJean"} 】 com.healerjean.proj.a_test.json.netSfJson.D01NetSfJson.test3[182]
普通數組 :【 ["奔馳","寶馬"] 】 com.healerjean.proj.a_test.json.netSfJson.D01NetSfJson.test3[193]
普通數組 :【 ["奔馳","寶馬"] 】 com.healerjean.proj.a_test.json.netSfJson.D01NetSfJson.test3[193]
數組中的JSONObject :【 [{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}] 】 com.healerjean.proj.a_test.json.netSfJson.D01NetSfJson.test3[191]
數組中的JSONObject :【 [{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}] 】 com.healerjean.proj.a_test.json.netSfJson.D01NetSfJson.test3[191]  

1.4、序列化

1.4.1、對象轉Json

1.4.1.1、日期序列化會變成如下
{"date":29,"day":2,"hours":17,"minutes":41,"month":9,"seconds":27,"time":1572342087782,"timezoneOffset":-480,"year":119} ,


@Test
    public void testStringDateOrLong() throws IOException {
        JsonDemoDTO jsonDemoDTO = new JsonDemoDTO();
        jsonDemoDTO.setTransDate(new Date());
        JSONObject jsonObject = JSONObject.fromObject(jsonDemoDTO);
        log.info("對象轉JSONObject 【 {} 】", jsonObject);
        // {"code":0,"companys":[],"msg":"","reqSn":"","strList":[],"transDate":{"date":29,"day":2,"hours":17,"minutes":41,"month":9,"seconds":27,"time":1572342087782,"timezoneOffset":-480,"year":119},"user":null}
    }

2、Jackson

2.1、1、JsonNode的獲取數據以及基本使用

注意點 JsonNode 使用log打印出的結果不是我們想要的,所以我們要使用 jsonNode.toString()

2.1.1、獲取數據值(默認取到的是JsonNode)

JsonNode類型   rootNode.path("fieldName")、  rootNode.get("fieldName") 一般建議使用get
String類型     node.textValue()  node.asText() node.toString()
Integer類型    node.intValue()  asInt()
BigDecimal類型 node.decimalValue() ,所以一般建議使用 基本類型Value()

2.1.2、判斷是不是數組(對象數組或者普通數組),判斷是不是對象,判斷是否擁有某個節點

2.1.3、簡單遍歷JsonNode , 獲取key的迭代集 rootNode.fieldNames()

2.1.4、遍歷 JsonNode(數組或者Json等都可以用它)

 @Test
    public void test1() {

        String json = JsonDemoDTO.jsonString();
        log.info("jsonString:【 {} 】", json);

        JsonNode rootNode = JsonUtils.toJsonNode(json);
        //1、獲取數據值(默認取到的是JsonNode)
        //      JsonNode類型 rootNode.path("fieldName")、  rootNode.get("fieldName") 一般建議使用get
        //      String類型 node.textValue()  node.asText() node.toString()
        //      Integer類型 node.intValue()  asInt()
        //      BigDecimal類型 node.decimalValue() ,所以一般建議使用 基本類型Value()

        log.info("------------------------------------------------");
        log.info("1、獲取數據值(默認取到的是JsonNode)");
        String msg = rootNode.get(CommonConstants.msg).textValue();
        String msgText = rootNode.get(CommonConstants.msg).asText();
        int code = rootNode.get(CommonConstants.code).asInt();
        Integer integer = rootNode.get(CommonConstants.integer).intValue();
        BigDecimal bigDecimal = rootNode.get(CommonConstants.bigDecimal).decimalValue();
        JsonNode userJsonNode = rootNode.get(CommonConstants.user);
        JsonNode companyJsonNodeArray = rootNode.get(CommonConstants.companys);
        JsonNode strJsonNodeArray = rootNode.get(CommonConstants.strList);

        log.info("msg:【 {} 】", msg);
        log.info("msgText:【 {} 】", msgText);
        log.info("code:【 {} 】", code);
        log.info("integer:【 {} 】", integer);
        log.info("bigDecimal:【 {} 】", bigDecimal);
        log.info("userJsonNode:【 {} 】", userJsonNode.toString());
        log.info("companyJsonNodeArray:【 {} 】", companyJsonNodeArray.toString());
        log.info("strJsonNodeArray:【 {} 】", strJsonNodeArray.toString());

        // 2、判斷是不是數組(對象數組或者普通數組),判斷是不是對象,判斷是否擁有某個節點
        log.info("------------------------------------------------");
        log.info("2、判斷是不是數組(對象數組或者普通數組),判斷是不是對象,判斷是否擁有某個節點");
        Boolean flagObject = userJsonNode.isObject();
        Boolean flagArray = strJsonNodeArray.isArray();
        Boolean exist = rootNode.has(CommonConstants.msg);

        log.info("flagObject:【 {} 】", flagObject);
        log.info("flagArray:【 {} 】", flagArray);
        log.info("exist:【 {} 】", exist);


        //3、簡單遍歷JsonNode , 獲取key的迭代集  rootNode.fieldNames()
        log.info("------------------------------------------------");
        log.info("3、簡單遍歷JsonNode , 獲取key的迭代集  rootNode.fieldNames()");
        Iterator<String> keys = rootNode.fieldNames();
        while (keys.hasNext()) {
            // 2、獲取節點的key值
            String key = keys.next();
            JsonNode jsonNode = rootNode.get(key);
            log.info("key:【 {} 】,value:【 {} 】", key, jsonNode.toString());
        }


        // 4、遍歷 JsonNode(數組或者Json等都可以用它)
        log.info("------------------------------------------------");
        log.info("4、遍歷 JsonNode(數組或者Json等都可以用它)");
        for (JsonNode jsonNode : companyJsonNodeArray) {
            log.info("jsonNode:【 {} 】", jsonNode.toString());
        }


        


        // jsonString:【 {"reqSn":"9f2aa3a63dcb493b97accc5fd4eee169","code":200,"msg":"Success","transDate":1572347467277,"integer":100,"bigDecimal":100,"user":{"userId":1,"userName":"HealerJean"},"strList":["奔馳","寶馬"],"companys":[{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}]} 】 [35]
        //         ------------------------------------------------ [44]
        // 1、獲取數據值(默認取到的是JsonNode) [45]
        // msg:【 Success 】 [55]
        // msgText:【 Success 】 [56]
        // code:【 200 】 [57]
        // integer:【 100 】 [58]
        // bigDecimal:【 100 】 [59]
        // userJsonNode:【 {"userId":1,"userName":"HealerJean"} 】 [60]
        // companyJsonNodeArray:【 [{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}] 】 [61]
        // strJsonNodeArray:【 ["奔馳","寶馬"] 】 [62]
        //         ------------------------------------------------ [65]
        // 3、判斷是不是數組(對象數組或者普通數組),判斷是不是對象,判斷是否擁有某個節點 [66]
        // flagObject:【 true 】 [75]
        // flagArray:【 true 】 [74]
        // exist:【 true 】 [79]
        //         ------------------------------------------------ [83]
        // 3、簡單遍歷JsonNode , 獲取key的迭代集  rootNode.fieldNames() [84]
        // key:【 reqSn 】,value:【 "9f2aa3a63dcb493b97accc5fd4eee169" 】 [90]
        // key:【 code 】,value:【 200 】 [90]
        // key:【 msg 】,value:【 "Success" 】 [90]
        // key:【 transDate 】,value:【 1572347467277 】 [90]
        // key:【 integer 】,value:【 100 】 [90]
        // key:【 bigDecimal 】,value:【 100 】 [90]
        // key:【 user 】,value:【 {"userId":1,"userName":"HealerJean"} 】 [90]
        // key:【 strList 】,value:【 ["奔馳","寶馬"] 】 [90]
        // key:【 companys 】,value:【 [{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}] 】 [90]
        //         ------------------------------------------------ [95]
        // 4、遍歷 JsonNode(數組或者Json等都可以用它) [96]
        // jsonNode:【 {"companyId":1,"companyName":"汽車公司"} 】 [98]
        // jsonNode:【 {"companyId":2,"companyName":"房產公司"} 】 [98]


    }

2.2、添加和刪除字段

2.2.1、基本數據添加、(日期,對象,集合數據不能直接添加,可以考慮將這些變成objectNode,在進行整合)

2.2.2、ObjectNode放入一個ObjectNode

2.2.3、兩個ObjectNode 合併爲一個

2.2.4、刪除某個節點

/**
     * 添加和刪除
     * 1、基本數據添加、(日期,對象,集合數據不能直接添加,可以考慮將這些變成objectNode,在進行整合)
     * 2、ObjectNode放入一個ObjectNode
     * 3、兩個ObjectNode 合併爲一個
     * 4、刪除某個節點
     */
    @Test
    public void test2() {
        String json = "{\"userId\":1,\"userName\":\"HealerJean\"}";
        String json1 = "{\"companyId\":1,\"companyName\":\"汽車公司\"}";
        log.info("json:【 {} 】", json);
        log.info("json1:【 {} 】", json1);

        ObjectNode objectNode = JsonUtils.toObjectNode(json);
        ObjectNode objectNode1 = JsonUtils.toObjectNode(json1);

        // 1、基本數據添加、(日期,對象,集合數據不能直接添加,可以考慮將這些變成objectNode,在進行整合)
        objectNode.put("reqSn", UUID.randomUUID().toString().replace("-", ""));
        objectNode.put("msg", "Success");
        objectNode.put("code", 200);
        // objectNode.put("transDate", new Date());
        // objectNode.put("strList", Arrays.asList(new String[]{"奔馳", "寶馬"}));
        // objectNode.put("user", new JsonDemoDTO.User().setUserId(1L).setUserName("HealerJean"));

        // 2、ObjectNode放入一個ObjectNode
        objectNode.putPOJO("node", objectNode1);

        // 3、兩個ObjectNode 合併爲一個
        objectNode.putAll(objectNode1);

        //4、刪除某個節點
        objectNode.remove("userId");

        JsonNode jsonNode = objectNode;
        log.info("jsonNode 【 {} 】", jsonNode.toString());

    }

2.3、複雜JsonNode遍歷

 /**
     * 3、 複雜JsonNode遍歷
     */
    @Test
    public void test3()  {
        String json = JsonDemoDTO.jsonString();
        log.info("jsonString:【 {} 】", json);
        JsonNode rootNode = JsonUtils.toJsonNode(json);

        //1、獲取Json節點的key集合
        Iterator<String> keys = rootNode.fieldNames();
        while (keys.hasNext()) {
            // 2、獲取節點的key值
            String key = keys.next();

            //3、獲取key獲取某個節點
            JsonNode value = rootNode.get(key);
            //4、判斷節點是一個對象
            if (value.isObject()) {
                log.info("key 【 {} 】, Json對象 :【 {} 】", key, value.toString());
            }
            //5、判斷節點是數組
            else if (value.isArray()) {
                // 普通數組沒有fieldName ,所以得到的name內部不存在,不會進入while循環,也不會報錯
                // Iterator<String> nodeKeys = jsonNode.fieldNames();
                // while (nodeKeys.hasNext()) {
                //     log.info("nodeKeys.next()" + nodeKeys.next());
                //}
                for (JsonNode node : value) {
                    if (node.isObject()) {
                        log.info("數組中的Json對象 :" + node.toString());
                    } else {
                        log.info("普通數組 :【 {} 】", node.toString());
                    }
                }
            } else {
                log.info("key 【 {} 】, 普通元素 :【 {} 】", key, value.toString());
            }
        }

        // jsonString:【 {"reqSn":"2305bbd5be23448082918daf2aaccfd0","code":200,"msg":"Success","transDate":1572348749670,"integer":100,"bigDecimal":100,"user":{"userId":1,"userName":"HealerJean"},"strList":["奔馳","寶馬"],"companys":[{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}]} 】 [178]
        // key 【 reqSn 】, 普通元素 :【 "2305bbd5be23448082918daf2aaccfd0" 】 [208]
        // key 【 code 】, 普通元素 :【 200 】 [208]
        // key 【 msg 】, 普通元素 :【 "Success" 】 [208]
        // key 【 transDate 】, 普通元素 :【 1572348749670 】 [208]
        // key 【 integer 】, 普通元素 :【 100 】 [208]
        // key 【 bigDecimal 】, 普通元素 :【 100 】 [208]
        // key 【 user 】, Json對象 :【 {"userId":1,"userName":"HealerJean"} 】 [191]
        // 普通數組 :【 "奔馳" 】 [204]
        // 普通數組 :【 "寶馬" 】 [204]
        // 數組中的Json對象 :{"companyId":1,"companyName":"汽車公司"} [202]
        // 數組中的Json對象 :{"companyId":2,"companyName":"房產公司"} [202]


    }

2.4、配置對象中null的元素轉Json後不存在

**
     * 4、配置對象中null的元素轉Json後不存在
     */
    @Test
    public void test4() throws JsonProcessingException {

        // 1、註解@JsonInclude(JsonInclude.Include.NON_NULL)

        // 2。objectmapper配置
        JsonDemoDTO jsonDemoDTO = new JsonDemoDTO();
        jsonDemoDTO.setTransDate(new Date());
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        String json = objectMapper.writeValueAsString(jsonDemoDTO);
        log.info("對象轉Json 【 {} 】", json);
        // {"code":0,"transDate":1572343184051}

    }

2.5、序列化

2.5.1、對象轉Json

2.5.1.1、日期序列化會變成Long
 /**
     * 5、序列化問題:
     *  對象轉JSONObject 序列化的日期 變成 Long 1572343018614
     */
    @Test
    public void test5() throws JsonProcessingException {
        JsonDemoDTO jsonDemoDTO = new JsonDemoDTO();
        jsonDemoDTO.setTransDate(new Date());
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(jsonDemoDTO);
        log.info("對象轉JSON  【 {} 】", json);
        //{"reqSn":null,"code":0,"msg":null,"transDate":1572343018614,"user":null,"strList":null,"companys":null}
    }

3、Gson

3.1、JsonObject的獲取數據以及基本使用

3.1.1、獲取數據值(默認取到的是JsonElement)

3.1.2、JsonArray中獲取 JsonObject對象

3.1.3、判斷是不是數組(對象數組或者普通數組),,判斷是不是對象,判斷是否擁有某個節點

3.1.4、簡單遍歷jsonObject

3.1.5、遍歷JsonArray

3.1.5.1、遍歷正常JsonArray
3.1.5.2、遍歷String集合的JsonArray
/**
     * 1、JsonObject的獲取數據以及基本使用
     * 1.1、獲取數據值(默認取到的是JsonElement)
     * 1.2、JsonArray中獲取 JsonObject對象
     * 1.3、判斷是不是數組(對象數組或者普通數組),,判斷是不是對象,判斷是否擁有某個節點
     * 1.4、簡單遍歷jsonObject
     * 1.5.1.、遍歷正常JsonArray
     * 1.5.2、遍歷String集合的JsonArray
     */
    @Test
    public void test1() {
        String json = JsonDemoDTO.jsonString();
        log.info("jsonString:【 {} 】", json);

        JsonParser parser = new JsonParser();
        JsonObject jsonObject = parser.parse(json).getAsJsonObject();

        // 1、獲取數據值(默認取到的是JsonElement)
        log.info("------------------------------------------------");
        log.info("1、獲取數據值(默認取到的是JsonElement)");
        String msg = jsonObject.get(CommonConstants.msg).getAsString();
        int code = jsonObject.get(CommonConstants.code).getAsInt();
        BigDecimal bigDecimal = jsonObject.get(CommonConstants.bigDecimal).getAsBigDecimal();
        JsonObject userJsonObject = jsonObject.get(CommonConstants.user).getAsJsonObject();
        JsonArray companyJsonArray = jsonObject.get(CommonConstants.companys).getAsJsonArray();
        JsonArray strJsonArray = jsonObject.get(CommonConstants.strList).getAsJsonArray();
        log.info("msg:【 {} 】", msg);
        log.info("code:【 {} 】", code);
        log.info("bigDecimal:【 {} 】", bigDecimal);
        log.info("userJsonObject:【 {} 】", userJsonObject);
        log.info("companyJsonArray:【 {} 】", companyJsonArray);
        log.info("strJsonArray:【 {} 】", strJsonArray);

        // 2、JsonArray中獲取 JsonObject對象
        log.info("------------------------------------------------");
        log.info(" 2、JsonArray中獲取 JsonObject對象");
        JsonObject company0 = companyJsonArray.get(0).getAsJsonObject();
        log.info("company0:【 {} 】", company0);


        // 3、判斷是不是數組(對象數組或者普通數組),,判斷是不是對象,判斷是否擁有某個節點
        log.info("------------------------------------------------");
        log.info("3、判斷是不是數組(對象數組或者普通數組),判斷是不是對象,判斷是否擁有某個節點");
        Boolean flagObject = userJsonObject.isJsonObject();
        Boolean flagArray = companyJsonArray.isJsonArray();
        Boolean exist = userJsonObject.has(CommonConstants.msg);
        log.info("flagObject:【 {} 】", flagObject);
        log.info("flagArray:【 {} 】", flagArray);
        log.info("exist:【 {} 】", exist);


        // 4、簡單遍歷jsonObject
        log.info("------------------------------------------------");
        log.info("4、簡單遍歷jsonObject");
        Set<String> keys = jsonObject.keySet();
        for (String key : keys) {
            Object value = jsonObject.get(key);
            log.info("key:【 {} 】,value:【 {} 】", key, value);
        }

        //5.1.、遍歷正常JsonArrayy
        log.info("------------------------------------------------");
        log.info("5.1.、遍歷正常JsonArrayy");
        Iterator iteratorCompany = companyJsonArray.iterator();
        while (iteratorCompany.hasNext()) {
            Object object = iteratorCompany.next();
            log.info("object:【 {} 】", object);
        }

        //5.2、遍歷String集合的JsonArrayy
        log.info("------------------------------------------------");
        log.info("5.2、遍歷String集合的JsonArrayy");
        Iterator iteratorCar = strJsonArray.iterator();
        while (iteratorCar.hasNext()) {
            Object object = iteratorCar.next();
            log.info("object:【 {} 】", object);
        }


        // jsonString:【 {"reqSn":"e5b9e4c6a5e0460b930ed4d38e3c75d4","code":200,"msg":"Success","transDate":1572351096471,"integer":100,"bigDecimal":100,"user":{"userId":1,"userName":"HealerJean"},"strList":["奔馳","寶馬"],"companys":[{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}]} 】[101]
        //         ------------------------------------------------[107]
        // 1、獲取數據值(默認取到的是JsonElement)[108]
        // msg:【 Success 】[115]
        // code:【 200 】[116]
        // bigDecimal:【 100 】[117]
        // userJsonObject:【 {"userId":1,"userName":"HealerJean"} 】[118]
        // companyJsonArray:【 [{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}] 】[119]
        // strJsonArray:【 ["奔馳","寶馬"] 】[120]
        //         ------------------------------------------------[123]
        // 2、JsonArray中獲取 JsonObject對象[124]
        // company0:【 {"companyId":1,"companyName":"汽車公司"} 】[126]
        //         ------------------------------------------------[130]
        // 3、判斷是不是數組(對象數組或者普通數組),判斷是不是對象,判斷是否擁有某個節點[131]
        // flagObject:【 true 】[135]
        // flagArray:【 true 】[136]
        // exist:【 false 】[137]
        //         ------------------------------------------------[141]
        // 4、簡單遍歷jsonObject[142]
        // key:【 reqSn 】,value:【 "e5b9e4c6a5e0460b930ed4d38e3c75d4" 】[146]
        // key:【 code 】,value:【 200 】[146]
        // key:【 msg 】,value:【 "Success" 】[146]
        // key:【 transDate 】,value:【 1572351096471 】[146]
        // key:【 integer 】,value:【 100 】[146]
        // key:【 bigDecimal 】,value:【 100 】[146]
        // key:【 user 】,value:【 {"userId":1,"userName":"HealerJean"} 】[146]
        // key:【 strList 】,value:【 ["奔馳","寶馬"] 】[146]
        // key:【 companys 】,value:【 [{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}] 】[146]
        //         ------------------------------------------------[150]
        // 5.1.、遍歷正常JsonArrayy[151]
        // object:【 {"companyId":1,"companyName":"汽車公司"} 】[155]
        // object:【 {"companyId":2,"companyName":"房產公司"} 】[155]
        //         ------------------------------------------------[159]
        // 5.2、遍歷String集合的JsonArrayy[160]
        // object:【 "奔馳" 】[164]
        // object:【 "寶馬" 】[164]


        //
        // //1、添加基本數據
        // jsonObject.addProperty("age",27);
        // //2、添加Json對象
        // JsonElement param = parser.parse(paramJson);
        // jsonObject.add("param" ,param);
        // System.out.println(jsonObject.toString());
        // //{"cars":["奔馳","寶馬"],"friends":[{"friendName":"小明","friendSex":"男"},{"friendName":"小花","friendSex":"女"}],"age":27,"param":{"name":"張宇晉","date":"Sep 12, 2019 2:11:52 PM"}}

    }

3.2、添加和刪除字段

3.2.1、基本數據添加、(日期,對象,集合數據不能直接添加,可以考慮將這些變成JSONObject,在進行整合)

3.2.2、JSONObject放入一個JSONObject

3.2.3、兩個JSONObject 合併爲一個 (藉助工具類)

3.2.4、刪除某個節點


    /**
     * 2、添加和刪除字段
     * 1、基本數據添加、(日期,對象,集合數據不能直接添加,可以考慮將這些變成JSONObject,在進行整合)
     * 2、JSONObject放入一個JSONObject
     * 3、兩個JSONObject 合併爲一個 (藉助工具類)
     * 4、刪除某個節點
     */
    @Test
    public void test2() {

        // 1、正常數據添加 只能放入基本類型數據
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("reqSn", UUID.randomUUID().toString().replace("-", ""));
        jsonObject.addProperty("msg", "Success");
        jsonObject.addProperty("code", 200);
        //不可以放入日期屬性,集合屬性,對象屬性
        // jsonObject.addProperty("transDate", new Date());
        // jsonObject.addProperty("strList", Arrays.asList(new String[]{"奔馳", "寶馬"}));
        // jsonObject.addProperty("user", new JsonDemoDTO.User().setUserId(1L).setUserName("HealerJean"));
        log.info("jsonObject_1 :【 {} 】", jsonObject);


        // 2、JSONObject放入一個JSONObject
        JsonObject fieldJsonObject = new JsonObject();
        fieldJsonObject.addProperty("key", "Str");
        fieldJsonObject.add("key", fieldJsonObject);
        log.info("2、JSONObject放入一個JSONObject :【 {} 】", jsonObject);


        // 3、兩個JSONObject 合併爲一個
        JsonObject userJsonObject = new JsonObject();
        // 4、刪除某個節點
        jsonObject.remove("msg");
        userJsonObject.addProperty("userKey", "JsonObject");
        GsonUtil.putAll(jsonObject, userJsonObject);
        log.info("3、兩個JsonObject 合併爲一個 :【 {} 】", jsonObject);
    }

3.3、序列化

3.3.1、對象轉Json

3.3.1.1、日期序列化之後會變成 “Oct 29, 2019 7:39:03 PM”
  
    @Test
    public void test3_1() {
        Gson gson = new Gson();
        JsonDemoDTO jsonDemoDTO = JsonDemoDTO.jsonDemo();
        String json = gson.toJson(jsonDemoDTO);
        log.info("對象轉Json【 {} 】", json);
        // 對象轉Json【 {"reqSn":"a615312e8a854387881e34570d93a37f","code":200,"msg":"Success","transDate":"Oct 29, 2019 7:39:03 PM","integer":100,"bigDecimal":100,"user":{"userId":1,"userName":"HealerJean"},"strList":["奔馳","寶馬"],"companys":[{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}]} 】
    }

3.3.2、Json轉對象

  /**
     * 3.2、Json轉對象
     */
    @Test
    public void test3_2() {
        Gson gson = new Gson();
        JsonDemoDTO jsonDemoDTO = new JsonDemoDTO().setMsg("Success");
        String json = gson.toJson(jsonDemoDTO);
        jsonDemoDTO = gson.fromJson(json, JsonDemoDTO.class);
        log.info("Json轉對象【 {} 】", jsonDemoDTO);
        // Json轉對象【 {"code":0,"msg":"Success"} 】
    }

3.3.3、Json/對象轉JsonObject

注意:必須經歷String類型,才能到JsonObject

 @Test
    public void test3_3() {
        String json = "{\"code\":0,\"msg\":\"Success\"}";
        JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
        log.info("Json轉JsonObject 【 {} 】", jsonObject.toString());

        JsonDemoDTO jsonDemoDTO = new JsonDemoDTO().setMsg("Success");
        Gson gson = new Gson();
        json = gson.toJson(jsonDemoDTO);
        jsonObject = new JsonParser().parse(json).getAsJsonObject();
        log.info("對象轉JsonObject 【 {} 】", jsonObject.toString());

    }

3.3.4、json轉集合、集合轉Json(使用工具類,轉化爲JsonArray,然後進行拼接)

 /**
     *  json轉集合
     * 注意,1、轉化爲JsonArray,然後進行拼接
     */
    @Test
    public void test3_4() {
        JsonDemoDTO jsonDemo1 = new JsonDemoDTO().setMsg("Success");
        JsonDemoDTO jsonDemo2 = new JsonDemoDTO().setMsg("Error");
        List<JsonDemoDTO> list = new ArrayList<>();
        list.add(jsonDemo1);
        list.add(jsonDemo2);

        String json = GsonUtil.toJsonString(list);
        list = GsonUtil.toList(json, JsonDemoDTO.class);
        log.info("json轉集合 【 {} 】", list);

    }



  public static <T> List<T> toList(String json, Class<T> cls) {
        List<T> list = new ArrayList<T>();
        JsonArray array = parser.parse(json).getAsJsonArray();
        for (final JsonElement elem : array) {
            list.add(gson.fromJson(elem, cls));
        }
        return list;
    }

4、FastJson

4.1、JSONObject的獲取數據以及基本使用

4.1.1、獲取數據值

4.1.2、JSONArray中獲取 JsonObject對象

4.1.3、判斷JSONObject是否存在節點

4.1.4、簡單遍歷 JSONObject

4.1.5、遍歷JSONArray

4.1.5.1.、遍歷正常JSONArray
4.1.5.2、遍歷String集合的JSONArray
 /**
     * 1、JSONObject的獲取數據以及基本使用
     * 1、獲取數據值
     * 2、JSONArray中獲取 JsonObject對象
     * 3、判斷JSONObject是否存在節點
     * 4、簡單遍歷 JSONObject
     * 5、遍歷JSONArray
     * 5.1.、遍歷正常JSONArray
     * 5.2、遍歷String集合的JSONArray
     *
     */
    @Test
    public void test1() {
        String json = JsonDemoDTO.jsonString();
        log.info("jsonString:【 {} 】", json);
        JSONObject jsonObject = JSONObject.parseObject(json);

        // 1、獲取數據值
        log.info("------------------------------------------------");
        log.info("1、從JSONObject中獲取簡單數據");
        String msg = jsonObject.getString(CommonConstants.msg);
        int code = jsonObject.getIntValue(CommonConstants.code);
        BigDecimal bigDecimal = jsonObject.getBigDecimal(CommonConstants.bigDecimal);
        JSONObject userJSONObject = jsonObject.getJSONObject(CommonConstants.user);
        JSONArray companyJSONArray = jsonObject.getJSONArray(CommonConstants.companys);
        JSONArray strJSONArray = jsonObject.getJSONArray(CommonConstants.strList);
        log.info("msg:【 {} 】", msg);
        log.info("code:【 {} 】", code);
        log.info("bigDecimal:【 {} 】", bigDecimal);
        log.info("userJSONObject:【 {} 】", userJSONObject);
        log.info("companyJSONArray:【 {} 】", companyJSONArray);
        log.info("strJSONArray:【 {} 】", strJSONArray);


        // 2、JSONArray中獲取 JsonObject對象
        log.info("------------------------------------------------");
        log.info(" 2、JsonArray中獲取 JsonObject對象");
        JSONObject company0 = companyJSONArray.getJSONObject(0);
        log.info("company0:【 {} 】", company0);


        // 3、判斷JSONObject是否存在節點
        log.info("------------------------------------------------");
        log.info("3、判斷JSONObject是否存在節點");
        Boolean flagContainsKey = jsonObject.containsKey(CommonConstants.msg);
        log.info("flagContainsKey:【 {} 】", flagContainsKey);

        //4、簡單遍歷 JSONObject
        log.info("------------------------------------------------");
        log.info("4、簡單遍歷 JSONObject");
        for (Object key : jsonObject.keySet()) {
            Object value = jsonObject.get(key);
            log.info("key:【 {} 】,value:【 {} 】", key, value);
        }

        //5.1.、遍歷正常JSONArray
        log.info("------------------------------------------------");
        log.info("5.1.、遍歷正常JSONArray");
        Iterator iteratorCompany = companyJSONArray.iterator();
        while (iteratorCompany.hasNext()) {
            Object object = iteratorCompany.next();
            log.info("object:【 {} 】", object);
        }

        //5.2、遍歷String集合的JSONArray
        log.info("------------------------------------------------");
        log.info("5.2、遍歷String集合的JSONArray");
        Iterator iteratorCar = strJSONArray.iterator();
        while (iteratorCar.hasNext()) {
            Object object = iteratorCar.next();
            log.info("object:【 {} 】", object);
        }

    }





 // jsonString:【 {"reqSn":"5b0ac33c6f5b4931b9311c9b98243d9c","code":200,"msg":"Success","transDate":1572356266239,"integer":100,"bigDecimal":100,"user":{"userId":1,"userName":"HealerJean"},"strList":["奔馳","寶馬"],"companys":[{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}]} 】 [36]
        //         ------------------------------------------------ [40]
        // 1、從JSONObject中獲取簡單數據 [41]
        // msg:【 Success 】 [48]
        // code:【 200 】 [49]
        // bigDecimal:【 100 】 [50]
        // userJSONObject:【 {"userName":"HealerJean","userId":1} 】 [51]
        // companyJSONArray:【 [{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}] 】 [52]
        // strJSONArray:【 ["奔馳","寶馬"] 】 [53]
        //         ------------------------------------------------ [57]
        // 2、JsonArray中獲取 JsonObject對象 [58]
        // company0:【 {"companyId":1,"companyName":"汽車公司"} 】 [60]
        //         ------------------------------------------------ [64]
        // 3、判斷JSONObject是否存在節點 [65]
        // flagContainsKey:【 true 】 [67]
        //         ------------------------------------------------ [70]
        // 4、簡單遍歷 JSONObject [71]
        // key:【 msg 】,value:【 Success 】 [74]
        // key:【 code 】,value:【 200 】 [74]
        // key:【 strList 】,value:【 ["奔馳","寶馬"] 】 [74]
        // key:【 companys 】,value:【 [{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}] 】 [74]
        // key:【 transDate 】,value:【 1572356266239 】 [74]
        // key:【 integer 】,value:【 100 】 [74]
        // key:【 bigDecimal 】,value:【 100 】 [74]
        // key:【 user 】,value:【 {"userName":"HealerJean","userId":1} 】 [74]
        // key:【 reqSn 】,value:【 5b0ac33c6f5b4931b9311c9b98243d9c 】 [74]
        //         ------------------------------------------------ [78]
        // 5.1.、遍歷正常JSONArray [79]
        // object:【 {"companyId":1,"companyName":"汽車公司"} 】 [83]
        // object:【 {"companyId":2,"companyName":"房產公司"} 】 [83]
        //         ------------------------------------------------ [87]
        // 5.2、遍歷String集合的JSONArray [88]
        // object:【 奔馳 】 [92]
        // object:【 寶馬 】 [92]

4.2、添加和刪除字段

4.2.1、基本數據、日期,對象,集合數據添加

4.2.2、JSONObject放入一個JSONObje

4.2.3、兩個JSONObject 合併爲一個

4.2.4、刪除某個節點


    /**
     * 2、添加和刪除字段
     * 1、基本數據、日期,對象,集合數據添加
     * 2、JSONObject放入一個JSONObject
     * 3、兩個JSONObject 合併爲一個
     * 4、刪除某個節點
     */
    @Test
    public void test2() {
        // 1、基本數據、日期,對象,集合數據添加
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("reqSn", UUID.randomUUID().toString().replace("-", ""));
        jsonObject.put("msg", "Success");
        jsonObject.put("code", 200);
        jsonObject.put("transDate", new Date());
        jsonObject.put("strList", Arrays.asList(new String[]{"奔馳", "寶馬"}));
        jsonObject.put("user", new JsonDemoDTO.User().setUserId(1L).setUserName("HealerJean"));
        jsonObject.put("companys", Arrays.asList(new JsonDemoDTO.Company[]{
                new JsonDemoDTO.Company().setCompanyId(1L).setCompanyName("汽車公司"),
                new JsonDemoDTO.Company().setCompanyId(2L).setCompanyName("房產公司")}));
        log.info("jsonObject_1 :【 {} 】", jsonObject);


        // 2、JSONObject放入一個JSONObject
        JSONObject fieldJsonObject = new JSONObject();
        fieldJsonObject.put("key", "Str");
        jsonObject.put("fieldJsonObject", fieldJsonObject);
        log.info("2、JSONObject放入一個JSONObject :【 {} 】", jsonObject);


        // 3、兩個JSONObject 合併爲一個
        JSONObject userJsonObject = new JSONObject();
        // 4、刪除某個節點
        jsonObject.remove("user");
        userJsonObject.put("user", new JsonDemoDTO.User().setUserId(1L).setUserName("HealerJean"));
        jsonObject.putAll(userJsonObject);
        log.info("3、兩個JSONObject 合併爲一個 :【 {} 】", jsonObject);

    }

4.3、序列化

4.3.1、對象轉轉Json

4.3.1.1、日期序列化會變成Long
/**
     * 對象轉轉Json
     * 日期序列化會變成Long
     */
    @Test
    public void test3_1() {
        JsonDemoDTO jsonDemoDTO = JsonDemoDTO.jsonDemo();
        String json = JSONObject.toJSONString(jsonDemoDTO);
        log.info("對象轉Json【 {} 】", json);
        //對象轉Json【 {"bigDecimal":100,"code":200,"companys":[{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}],"integer":100,"msg":"Success","reqSn":"85db4a55277d4d0da05692b94239717c","strList":["奔馳","寶馬"],"transDate":1572353435560,"user":{"userId":1,"userName":"HealerJean"}} 】
    }

4.3.2、Json轉對象

/**
*  json轉對象
*/
@Test
public void test3_2() {
    String json = JsonDemoDTO.jsonString();
    JsonDemoDTO jsonDemoDTO = JSONObject.parseObject(json, JsonDemoDTO.class);
    log.info("Json轉對象【 {} 】", jsonDemoDTO);
    
    //Json轉對象【 {"bigDecimal":100,"code":200,"companys":[{"companyId":1,"companyName":"汽車公司"},{"companyId":2,"companyName":"房產公司"}],"integer":100,"msg":"Success","reqSn":"72fa274d3b4f4c3ab9453f0c74859754","strList":["奔馳","寶馬"],"transDate":1572353529387,"user":{"userId":1,"userName":"HealerJean"}} 】
}

4.3.3、Json/對象轉JSONObject

注意:必須經歷String類型,才能到JSONObject

   /**
     *  json/對象轉JSONObject
     *  注意:必須經歷String類型,才能到JSONObject
     */
    @Test
    public void test3_3() {
        String json = JsonDemoDTO.jsonString();
        JSONObject jsonObject = JSONObject.parseObject(json);
        log.info("Json轉JSONObject【 {} 】", jsonObject.toJSONString());

        JsonDemoDTO jsonDemoDTO = JsonDemoDTO.jsonDemo();
        jsonObject =   JSONObject.parseObject(JSONObject.toJSONString(jsonDemoDTO));
        log.info("對象轉JsonObject 【 {} 】", jsonObject.toJSONString());
    }

4.3.4、Json轉集合、集合轉Json

/**
 * 4、 json轉集合
*/
@Test
public void toList() {
    JsonDemoDTO jsonDemo1 = new JsonDemoDTO().setMsg("Success");
    JsonDemoDTO jsonDemo2 = new JsonDemoDTO().setMsg("Error");
    List<JsonDemoDTO> list = new ArrayList<>();
    list.add(jsonDemo1);
    list.add(jsonDemo2);
    String json = JSONObject.toJSONString(list);

    list = JSONObject.parseArray(json, JsonDemoDTO.class);
    log.info("json轉集合 【 {} 】", list);
}

工具類

1、JsonUtils

package com.healerjean.proj.util.json;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.type.TypeFactory;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.healerjean.proj.util.sensitivity.SensitiveInfoUtils;
import com.healerjean.proj.util.sensitivity.SensitiveSerializerModifier;
import com.healerjean.proj.util.sensitivity.SensitiveTypeEnum;
import com.healerjean.proj.util.sensitivity.SensitivityConstants;

import java.io.IOException;
import java.io.Writer;
import java.lang.reflect.Type;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import java.util.Set;

/**
 * Utils - JSON
 */
public final class JsonUtils {

    /**
     * ObjectMapper
     */
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    private static final ObjectMapper  objectMapperSensitivity = new ObjectMapper();


    static {


        OBJECT_MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

        //NULL 不打印
        OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        // 排除json字符串中實體類沒有的字段
        OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);


        //LocalDateTime   LocalDate LocalTime 轉化成 String
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));

        OBJECT_MAPPER.registerModule(javaTimeModule);
        OBJECT_MAPPER.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);




        //脫敏日誌創建
        objectMapperSensitivity.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);
        objectMapperSensitivity.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapperSensitivity.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
        objectMapperSensitivity.registerModule(javaTimeModule);
        objectMapperSensitivity.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        //脫敏
        objectMapperSensitivity.setSerializerFactory(objectMapperSensitivity.getSerializerFactory().withSerializerModifier(new SensitiveSerializerModifier()));

    }

    public static ObjectMapper getObjectMapper() {
        return OBJECT_MAPPER;
    }


    /**
     * 將對象轉換爲JSON字符串
     *
     * @param value 對象
     * @return JSON字符串
     */
    public static String toJsonString(Object value) {
        try {
            return OBJECT_MAPPER.writeValueAsString(value);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    /**
     * 將JSON字符串轉換爲對象
     *
     * @param json      JSON字符串
     * @param c 類型
     * @return 對象
     */
    public static <T> T toObject(String json, Class<T> c) {
        try {
            return OBJECT_MAPPER.readValue(json, c);
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    /**
     * 將JSON字符串轉換爲對象
     * @param json          JSON字符串
     * @param typeReference 類型 可以通過這個轉化爲List集合 ,舉例:
     *                      List<JavaBean> list =  JsonUtils.toObject(jsonArrayStr, new TypeReference<List<JavaBean>>() { });
     *                      Map<String, Object> map =  JsonUtils.toObject(JsonUtils.toJson(javaBean),new TypeReference<Map<String, Object>>( ){} );
     * @return 對象
     */
    public static <T> T toObject(String json, TypeReference<?> typeReference) {
        try {
            return OBJECT_MAPPER.readValue(json, typeReference);
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    /**
     * 將JSON字符串轉換爲對象
     *
     * @param json     JSON字符串
     * @param javaType 類型
     * @return 對象
     */
    public static <T> T toObject(String json, JavaType javaType) {
        try {
            return OBJECT_MAPPER.readValue(json, javaType);
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }




    /**
     * 將JSON字符串轉換爲樹
     *
     * @param json JSON字符串
     * @return 樹
     */
    public static JsonNode toJsonNode(String json) {
        try {
            return OBJECT_MAPPER.readTree(json);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e.getMessage(), e);
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    /**
     * 將JSON字符串轉換爲toObjectNode
     */
    public static ObjectNode toObjectNode(String json) {
        try {
            return (ObjectNode)OBJECT_MAPPER.readTree(json);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e.getMessage(), e);
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    /**
     * 將對象轉換爲JSON流
     *
     * @param writer Writer
     * @param value  對象
     */
    public static void writeValue(Writer writer, Object value) {
        try {
            OBJECT_MAPPER.writeValue(writer, value);
        } catch (JsonGenerationException e) {
            throw new RuntimeException(e.getMessage(), e);
        } catch (JsonMappingException e) {
            throw new RuntimeException(e.getMessage(), e);
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }


    /**
     * 構造類型
     * @param type 類型,類,接口,枚舉字段類型 (java.class)
     * @return 類型
     */
    public static JavaType constructType(Type type) {
        return TypeFactory.defaultInstance().constructType(type);
    }


    /**
     * 構造類型
     * @param typeReference 類型 new TypeReference<List<JavaBean>>() { }
     * @return 類型
     */
    public static JavaType constructType(TypeReference<?> typeReference) {
        return TypeFactory.defaultInstance().constructType(typeReference);
    }


    /**
     * @param resString
     * @return String
     * @Description Json 格式化到控制檯打印
     */
    public static String responseFormat(String resString) {

        StringBuffer jsonForMatStr = new StringBuffer();
        int level = 0;
        ////將字符串中的字符逐個按行輸出
        for (int index = 0; index < resString.length(); index++) {
            //獲取s中的每個字符
            char c = resString.charAt(index);

            //level大於0並且jsonForMatStr中的最後一個字符爲\n,jsonForMatStr加入\t
            if (level > 0 && '\n' == jsonForMatStr.charAt(jsonForMatStr.length() - 1)) {
                jsonForMatStr.append(getLevelStr(level));
            }
            //遇到"{"和"["要增加空格和換行,遇到"}"和"]"要減少空格,以對應,遇到","要換行
            switch (c) {
                case '{':
                case '[':
                    jsonForMatStr.append(c + "\n");
                    level++;
                    break;
                case ',':
                    jsonForMatStr.append(c + "\n");
                    break;
                case '}':
                case ']':
                    jsonForMatStr.append("\n");
                    level--;
                    jsonForMatStr.append(getLevelStr(level));
                    jsonForMatStr.append(c);
                    break;
                default:
                    jsonForMatStr.append(c);
                    break;
            }
        }
        return jsonForMatStr.toString();
    }

    /**
     * @param level
     * @return
     * @throws
     */
    private static String getLevelStr(int level) {
        StringBuffer levelStr = new StringBuffer();
        for (int levelI = 0; levelI < level; levelI++) {
            levelStr.append("\t");
        }
        return levelStr.toString();
    }



    /**
     * 對象轉Json格式字符串----脫敏處理(包含map)
     * @return
     */
    public static String toJsonStringWithSensitivity(Object propName){
        if(propName != null && propName instanceof Map){
            Map map = (Map) propName;
            if(map != null && !map.isEmpty()){
                Set<Map.Entry> set = map.entrySet();
                for (Map.Entry item: set) {
                    Object key = item.getKey();
                    Object value = item.getValue();
                    if(key instanceof String){
                        String keyString = key.toString();
                        String s = dealSensitivity(keyString, value.toString());
                        map.put(keyString, s);
                    }
                }
            }
        }
        try {
            return objectMapperSensitivity.writeValueAsString(propName);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }

    private static String dealSensitivity(String mapkey, String mapValue){
        //正則匹配
        for(Map.Entry<String, SensitiveTypeEnum> entry : SensitivityConstants.sensitivityRules.entrySet()){
            String rule = entry.getKey();
            int length = rule.length();
            int propLen = mapkey.length();
            if(mapkey.length() < length){
                continue;
            }
            int temp = rule.indexOf("*");
            String key = null;
            String substring = null;
            if(temp >= 0 ){
                if(temp < (length >> 2)){
                    key = rule.substring(temp+1,length);
                    substring = mapkey.substring(propLen-key.length(), propLen);
                }else{
                    key = rule.substring(0,temp);
                    substring = mapkey.substring(0,temp);
                }
                if(substring.equals(key)) {
                    return SensitiveInfoUtils.sensitveValue(entry.getValue(), mapValue);
                }
            }else if (rule.equals(mapkey)){
                return SensitiveInfoUtils.sensitveValue(entry.getValue(), mapValue );
            }
        }
        return mapValue;
    }


}

2、GsonUtils

package com.healerjean.proj.util.gson;

import com.google.gson.*;

import java.text.DateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * @author HealerJean
 * @ClassName GsonUtils
 * @date 2019/9/12  11:41.
 * @Description
 */
public class GsonUtil {

    private static Gson gson = null;
    private static JsonParser parser = null;

    static {
        GsonBuilder gb = new GsonBuilder();
        gb.registerTypeAdapter(java.util.Date.class, new DateSerializer()).setDateFormat(DateFormat.LONG);
        gb.registerTypeAdapter(java.util.Date.class, new DateDeserializer()).setDateFormat(DateFormat.LONG);
        gson = gb.create();
        parser = new JsonParser();

    }

    /**
     * 轉成json
     */
    public static String toJsonString(Object object) {
        return gson.toJson(object);
    }

    /**
     * 轉成bean
     */
    public static <T> T toObject(String gsonString, Class<T> cls) {
        return gson.fromJson(gsonString, cls);
    }

    /**
     * 轉換成JsonObject
     */
    public static JsonObject toJsonObject(String gsonString) {
        return parser.parse(gsonString).getAsJsonObject();
    }

    /**
     * 轉換成數組
     */
    public static JsonArray toJsonArray(String gsonString) {
        return parser.parse(gsonString).getAsJsonArray();
    }


    /**
     * 對象轉 JsonObject
     */
    public static JsonObject toJsonObject(Object object) {
        return toJsonElement(object).getAsJsonObject();
    }


    public static JsonElement toJsonElement(Object object) {
        return parser.parse(toJsonString(object));
    }



    /**
     * 轉成list
     */
    public static <T> List<T> toList(String json, Class<T> cls) {
        List<T> list = new ArrayList<T>();
        JsonArray array = parser.parse(json).getAsJsonArray();
        for (final JsonElement elem : array) {
            list.add(gson.fromJson(elem, cls));
        }
        return list;
    }


    /**
     * 合併多個JsonObejct對象
     */
    public static JsonObject putAll(JsonObject targetJsonObect, JsonObject tempJsonObejct) {
        Set<String> keys = tempJsonObejct.keySet();
        for (String key : keys) {
            targetJsonObect.add(key, tempJsonObejct.get(key));
        }
        return targetJsonObect;
    }


}

2.1、日期序列化Long工具

2.1.1、DateSerializer
package com.healerjean.proj.util.gson;

import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

import java.lang.reflect.Type;
import java.util.Date;

/**
 * @author HealerJean
 * @ClassName DateSerializer
 * @date 2019/9/12  16:31.
 * @Description
 */
public class DateSerializer implements JsonSerializer<Date> {
    @Override
    public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.getTime());
    }
}

2.1.2、DateDeserializer
package com.healerjean.proj.util.gson;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;

import java.lang.reflect.Type;
import java.util.Date;

/**
 * @author HealerJean
 * @ClassName DateDeserializer
 * @date 2019/9/12  16:31.
 * @Description
 */
public class DateDeserializer implements JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return new Date(json.getAsJsonPrimitive().getAsLong());
    }
}

ContactAuthor

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