Beyond Compare 4 序列號“這個授權金鑰已被吊銷”的解決辦法
轉自: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字串裡邊的欄位改掉。