1. 程式人生 > 其它 >分支語句及迴圈語句

分支語句及迴圈語句

轉自:https://github.com/ZhongFuCheng3y/athena

一、fastjson入門

以下內容來源:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN

它可以解析JSON格式的字串,支援將Java Bean序列化為JSON字串,也可以從JSON字串反序列化到JavaBean

fastjson優點:速度快、使用廣泛、使用簡單、功能完備、測試完備(之前爆了很多漏洞,現在我司走釋出流程都強制我們升級fastjson版本了),現在使用fastjson至少升級到1.2.60版本

速度快的原因:

1、自行編寫類似StringBuilder的工具類SerializeWriter。
2、使用ThreadLocal來快取buf。
3、使用asm避免反射
4、整合jdk實現的一些優化演算法

二、使用fastjson

首先我們在pom檔案中引入fastjson的依賴就好了:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>x.x.x</version>
</dependency>

fastjson的使用主要是三個物件:

  • JSON
  • JSONObject
  • JSONArray

JSONArray和JSONObject繼承JSON:

2.1 JSON物件

JSON這個類主要用於轉換

  • 將Java物件序列化為JSON字串
  • 將JSON字串反序列化為Java物件

所以,有三個方法我們用得特別多:

  • parseObject(String text, Class<T> clazz)
  • parseArray(String text, Class<T> clazz)
  • toJSONString(Object object)

2.2 JSONObject

JSON物件( JSONObject )中的資料都是以 key-value 形式出現,所以它實現了 Map 介面:

使用起來也很簡單,跟使用 Map 就沒多大的區別(因為它底層實際上就是操作 Map

),常用的方法:

  • getString(String key)
  • remove(Object key)

2.3 JSONArray

JSONArray則是JSON陣列,JSON陣列物件中儲存的是一個個JSON物件,所以類中的方法主要用於直接操作JSON物件

最常用的方法:

  • getJSONObject(int index)

三、實戰

從上面的簡單介紹我們已經可以知道了:

  • JSON用於將字串反序列化為JavaBean和JavaBean序列化為JSON
  • JSONObject代表的是JSON物件,底層通過Map來操作,常用getString等方法來獲取對應的值
  • JSONArray代表的是JSON物件陣列,底層實際上是List,它用作於操作JSON物件

一般來說,我們從資料庫拿到JSON資料以後,然後要對JSON進行修改。比如JSON串如下:

{
    "formId": "{$formId}",
    "link": "www.java3y.com",
    "text": [{
        "name": "java3y",
        "label": "3y",
        "value": {
            "value": "{$tureName}",
            "color": "",
            "emphasis": ""
        }
    }, {
        "name": "java4y",
        "label": "3y",
        "value": {
            "value": "{$title}",
            "color": "",
            "emphasis": ""
        }
    }, {
        "name": "java5y",
        "label": "5y",
        "value": {
            "value": "關注我的公眾號,更多幹貨",
            "color": "#ff0040",
            "emphasis": ""
        }
    }],
    "yyyImg": "",
    "yyyAge": "",
    "pagepath": ""
}

我們是不會直接操作JSON的,我們會將JSON轉成我們自己的JavaBean,再操作JavaBean,最後序列化為JSONString

從上面的JSON結構上來看還是相對複雜的,思路:

  • 我們可以根據JSON的結構構建對應的JavaBean
  • 使用JSON類將JSON字串反序列化為JavaBean
  • 修改JavaBean的值
  • 最後將JavaBean序列化為JSON字串

從上面的JSON結構,首先我們針對text這層抽象為一個JavaBean。(實際上最裡層的結構是value,但我這邊不需要處理value,所以就不抽象了)

/**
 * "name": "java3y",
 *  "label": "3y",
 *  "value": {
 *      "value": "{$tureName}",
 *      "color": "",
 *      "emphasis": ""
 *    }
 *
 *  對Text進行抽象
 */
public class TextInfo {

    private String name;
    private String label;

    // 因為value我這邊不需要操作,所以就不抽象了,如果每層都要處理,那就得抽象
    private Object value;


    // set get ... 省略 歡迎關注我的公眾號:Javay

}

然後對外層進行抽象:

public class ContentValue {
    private String formId;
    private String link;
    // 這裡是一個數組,我們就抽象為List,屬性名為text
    private List<TextInfo> text;

    private String yyyImg;
    private String yyyAge;
    private String pagepath;

    // set get ... 省略 歡迎關注我的公眾號:Javay

}

我們反序列化看一下:

public static void main(String[] args) {

    // JSON 字串
    String s = "{\"formId\":\"{$formId}\",\"link\":\"www.java3y.com\",\"text\":[{\"name\":\"java3y\",\"label\":\"3y\",\"value\":{\"value\":\"{$tureName}\",\"color\":\"\",\"emphasis\":\"\"}},{\"name\":\"java4y\",\"label\":\"3y\",\"value\":{\"value\":\"{$title}\",\"color\":\"\",\"emphasis\":\"\"}},{\"name\":\"java5y\",\"label\":\"5y\",\"value\":{\"value\":\"關注我的公眾號,更多幹貨\",\"color\":\"#ff0040\",\"emphasis\":\"\"}}],\"yyyImg\":\"\",\"yyyAge\":\"\",\"pagepath\":\"\"}";

    // 使用JSON物件 將JSON字串反序列化為JavaBean
    ContentValue contentValue = JSON.parse(s, ContentValue.class);
    System.out.println(contentValue);


    }

反序列化結果:

我們要改text裡邊的值,只需要操作JavaBean就好了:

public static void main(String[] args) {

    // JSON 字串
    String s = "{\"formId\":\"{$formId}\",\"link\":\"www.java3y.com\",\"text\":[{\"name\":\"java3y\",\"label\":\"3y\",\"value\":{\"value\":\"{$tureName}\",\"color\":\"\",\"emphasis\":\"\"}},{\"name\":\"java4y\",\"label\":\"3y\",\"value\":{\"value\":\"{$title}\",\"color\":\"\",\"emphasis\":\"\"}},{\"name\":\"java5y\",\"label\":\"5y\",\"value\":{\"value\":\"關注我的公眾號,更多幹貨\",\"color\":\"#ff0040\",\"emphasis\":\"\"}}],\"yyyImg\":\"\",\"yyyAge\":\"\",\"pagepath\":\"\"}";

    // 使用JSON物件 將JSON字串反序列化為JavaBean
    ContentValue contentValue = JSON.parse(s, ContentValue.class);
    List<TextInfo> text = contentValue.getText();
    for (TextInfo textInfo : text) {
        textInfo.setName("Java3y");
        textInfo.setLabel("關注我的公眾號唄");
    }


    // 修改後,反序列化回去
    String content = JSON.toJSONString(contentValue);
}

序列化結果:

輕鬆將JSON字串裡邊的欄位改掉。