導航:首頁 > 編程語言 > fastjson註解使用

fastjson註解使用

發布時間:2023-04-11 09:25:26

1. SpringCloud使用FastjsonHttpMessageConverter遇到的坑

1.序列化到前台時時間變成時間戳,沒有時間格式,SpringBoot自帶的配置時間序列化格式因為已經被替換了實現類所以不在生效,需要使用fastJson的時間設置方式@JSONField(format ="yyyy-MM-dd HH:mm:ss")在實體類上加上次註解即可。

2.在序列話到前台時候fastjson遍歷集合會存纖帆在對象被返回的情況,以及所有請求被攔截,但是處理不是很理想的情況,貼出配置供參考

當作一個Bean注冊掘豎滲

public class FastJsonHttpMessageConverter {

private static SetsupportedMediaTypes;

    public () {

supportedMediaTypes =new HashSet<>();

        supportedMediaTypes.add(MediaType.APPLICATION_JSON);

     判脊   supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);

    }

@Override

    public boolean canRead(Type type, Class contextClass, MediaType mediaType) {

return this.supports(contextClass) &&supportedMediaTypes.contains(mediaType);

    }

@Override

    public boolean canWrite(Type type, Class clazz, MediaType mediaType) {

return super.supports(clazz) &&supportedMediaTypes.contains(mediaType);

    }

@Override

    protected void writeInternal(Object object, HttpOutputMessage outputMessage)throws IOException, {

OutputStream out = outputMessage.getBody();

        String text = JSON.toJSONString(object, SerializerFeature.);

        byte[] bytes = text.getBytes("utf-8");

        out.write(bytes);

    }

}

2. fastJson的@JSONField和jackson的@JsonProperty使用

@JSONField
作用:在欄位和方法上

1 .Field:@JSONField作用在Field時,name可以定義輸入key的名字,反序列化的時 值不會賦值到屬性上灶扒

2 .作用在setter和getter方法上

3 .format :用在Date類型的欄位來格式化時間格式

4 .布爾類型:serialize和deserialize

在銷辯畝序列化的時候就不包含這個欄位了。deserialize與之相反。但是有一點需要注意,當欄位為final的時候註解放在欄位上是不起作用的,這時候應該放在get或set方法上。

5. serialzeFeatures 屬性:fastjson默認的序列化規則是當欄位的值為null的時候,是不會序列化這個欄位

對象序列化下邊的類,結果是:{"name":"LiSi","age":18}

6 .SerializerFeature枚舉

當value的值為null的時候,依然會把它的值序列化出來: {"name":"LiSi","age":18,"address":null}

當欄位類型為int類型時,會序列化成 0,需要把類型改成Integer

1 . 引入jar包

2 . jsonProperty介紹

@JsonProperty 此註解用於屬性上,作用是把該屬性的名稱序列化為另外一個名稱,如把trueName屬性序列化為name,@JsonProperty(value="name")。

3 . jackson的@JsonIgnore使用

作用:在json序列化時將java bean中的一些屬性忽略掉,序列化和虧森反序列化都受影響。

使用方法:一般標記在屬性或者方法上,返回的json數據即不包含該屬性。

3. Spring Boot使用@JsonProperty,@JsonIgnore,@JsonFormat註解

@JsonProperty, @JsonIgnore 和 @JsonFormat 註解都是 fasterxml jackson 裡面的註解,現在也被 Spring Boot 集成了。
這里需要注意的是將對象轉換成json字元串使用的方法是fasterxml.jackson提供的!!
如果使用fastjson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
沒有生效,為啥?
因為fastjson不認識@JsonProperty註解呀!所以要使用jackson自遲埋己的序列化工具方法

我們在使用上面的註解時,不需要在 pom.xml 顯示的引入 fasterxml jackson 的依賴包。只需要加入如下依賴即可。

@JsonProperty
用於屬性、setter / getter 方法上,屬性序列化後可重命名

生成的 json 字元串就是image_width和image_height。
@JsonIgnore

屬性使用此註解後,將不被序列化。

@JsonFormat
用於格式化日期

@JsonInclude,@JsonIgnoreProperties,@JsonIgnore

真實案例
{
"rowid": "111111",
"created": "液清2018-12-27 16:15:25",
"createdby": "1111111",
"lastupd": "2018-12-27 08:25:48",
"lastupdby": "111111",
"modificationnum": 1
}
返回Json參數欄位均為小寫,在接收時,需要按照標準的命名規則進行映射

解決辦法:

創建接收數據對象,生成Get\Set方法:,在Set方法上,加上@JsonProperty註解,

@JsonProperty 此註解用於屬性上,作用是把該屬性的名稱序列化為另鬧旦前外一個名稱,如把rowId屬性序列化為rowid,@JsonProperty("rowid")。

4. 當 Json 遇到 Map

了解一下日常開發中關於 Json 解析的一些非常規用法,以及使用 fastjson 的一些總結。

一般情況 Json 的使用都是非常簡單的。 我們會根據上游定義的 Json 數據格式,由下游定義相應的解析模型。比如像下面這個簡單的 Json 字元串。

一般會定義如下的數據類(以 Kotlin 為例)

具體使用也是非常簡單了,無論是藉助 fastjson 、gson 或者是原生的 JsonObject 都可以非常方便的完成數據的序列化和反序列操作,比如以 fastjson 為例。

無論原始的 Json 數據格式多麼的復雜,包含原始數據類型、List、數組還是他類型, 只要需要解析的屬性的 key 是確定的,那麼就可以定義出相應的數據模型來解析 。 因為在定義任何一個數據模型是時,對於其中的每一個欄位(或者叫做屬性、類成員),唯一需要確定的就是變數的類型和變數名的名稱,比如面對下面這個略顯復雜的 Json :

我們依舊可以定義出如下的數據模型

但有時候我們會遇到 Json 數據中,key 值無法確定的情況。也就是說,我們需要解析的欄位名是不確定的。或者說,Json 數據中欄位名和欄位值重合的情況。

比如上面這個 Json ,按照日期返回一個 List(至於 List 里具體是什麼,我們也無需關心)或者是其他任何數據,這里就比較有意思了。

既然返回的屬性名是無法確定的,那麼怎麼定義 Json 對應的數據類型中的變數名呢 ?

上面 ??? 這里應該怎麼定義呢? 畢竟總不能窮舉所有日期吧? 再說也窮舉不過來呀,時間是無限的呀。

這里就需要轉換一下思路了,我們從本質出發,這里整個 Json 其實是一個 Map 。既然是一個 Map ,那我們就把他當做一個 Map 去解析好了。

因此,fastjson 在解析的時候不知道具體該怎麼辦了,只知道這是個把原始 Json 字元串解析為一個 Map 。剩下的就該靠我們自己了. fastjson 不知道具體類型,我們自己是知道的呀。因此,就需要遍歷 map 自己去處理了。

到這里,我們就可以獲取到原始 Json 字元串中的數據了。可以看到,對於上游返回的 Map 這種類型的數據,由於其本身靈活的特性,我們需要按具體的類型做具體拆解,沒有通用的方法。

作為常用的 Json 序列化框架 ,這里總結一下使用 fastjson 遇到一些坑和收獲。

日常開發中上游給我們的 Json 數據往往是很豐富的,並且由於 json 的特性,在一大段字元串中要找到我們關系的欄位是有點困難的,因此我們往往把 Json 字元串貼到各類 Json解析助手之類的網站或工具里,進行格式化。其實,不用那麼麻煩,fastjson 自身提供了可以格式化列印 Json 的方法。

這里格式化列印一下剛才的 map printBeautyJson(map)

從截圖可以看到,已經實現了 Json 的格式化輸出。SerializerFeature 還有很多其他很多實用的功能,可以按需要進行配置。

JSONField 是一個定義在 fastjson 內的註解,其中最常用的兩個值是 serialize 和 deserialize ,都是 boolean 類型,用戶決定對特定欄位進行序列化和反序列化。

序列化畢竟是一個 IO 操作,在優化性能的場景,我們就可以基於實際業務場景和需求出發,減少非必要的序列和反序列操作,尤其是對一些比較打的對象。需要注意的是,deserialize 這個值只有把註解打在方法上時才是有效的(這點可以從其源碼看到)。

最後再說一個使用 fastjson 最最常見的問題,關於默認構造函數的問題。

我們知道一個普通的 Java 類,如果沒有定義構造函數的話,編譯器會幫我們自定生成一個構造函數。但是如果我們自己定義了構造函數,那麼默認的構造函數就沒了。

這個時候如果我們直接解析 Json 解析,會拋出異常。 com.alibaba.fastjson.JSONException: default constructor not found
至於具體原因,看一下源碼也很容易理解了。這個時候,就只能把默認的構造加上了。

而在使用 Kotlin 的場景,也是存在同樣的問題。

現在大家都習慣使用 data class 定義數據類。雖然這樣定義的類型,從反編譯的結果看似乎是存在默認構造函數的,但依舊會報錯。

可以看到是有存在構造函數的,但是依舊會產生問題。對於 Kotlin 的場景,我們用兩種解決辦法。

這樣依舊不解決問題。

to be continued ...

本文從 Json 解析常規用法出發,解讀了對 Map 這種 Json 數據類型的解析。從中可以學習到,有時候我們在面臨一些問題是會一籌莫展,會出現非常規的場景。這個時候,就需要我們從問題的本質出發,看透問題的根源,一層層抽絲剝縷的去解決。

問題總是會不斷出現的,重要的是在我們解決完問題之後不僅要學會解決方法,更要學會解決問題的思路。

5. 阿里fastjson到底如何使用

json是一種文件傳輸格式,類似於以 "/t" 分割,csv文件,是一種數據標准。
json的數消慶中據格式是這樣的:

大家一看就明白,類似於Map,是一種鍵值對的存在,其中{....} 代表對象,[..]代表拿山數組,中間以逗號分割。具體就不多說了,想要了解的隨便一搜就有很多。。。
接下來看阿里fastjson的用法:
首先fastjson是目前用途最廣泛,也是最好用的一種json工具。
首先你拿到json數據後可以使用parse方法將數差手據轉化為json對象(底層Map)

這樣你想要拿什麼欄位值直接 jsonObject.get("欄位名")就可以了

6. FastJson和Json以及@ResponseBody

@Restcontroller是@Controller和@ResponseBody的結合體,將後台返回的Java對象轉換為Json字元串傳遞給前台。它是springmvc通過配置實現的,spring默認帶的轉json包為jackson,因為fastJson比較快一般會引入fastjson來替換。

解決bean與json欄位不一致問題,或者欄位定義不符合前端所需岩租要的標准,需要使用@JsonProperty和@JSONField註解粗橡兆。
@jsonProperty是Jackson的包,@JSONproperty這個註解用於屬性上面
而@jsonfield是如鏈fastjson的包,@JSONField這個註解可以用於get、set以及屬性上面@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")是時間的格式化,可以用於get、set以及屬性上面

FastJson是阿里巴巴的開源JSON解析庫,它可以解析JSON格式的字元串,支持將Java Bean序列化為JSON字元串,也可以從JSON字元串反序列化到JavaBean。FastJson的API十分簡潔,FastJson重要的類為JSONObject,經常調用的方法如下:
public static final Object parse(String text); // 把JSON文本parse為JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final T parseObject(String text, Class clazz); // 把JSON文本parse為JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合
public static final String toJSONString(Object object); // 將JavaBean序列化為JSON文本public static final String toJSONString(Object object, boolean prettyFormat); // 將JavaBean序列化為帶格式的JSON文本
public static final Object toJSON(Object javaObject); 將JavaBean轉換為JSONObject或者JSONArray。

Jackson相對來說比較高效的Json類庫,在項目中主要使用Jackson進行JSON和Java對象轉換,Jackson ObjectMapper類是使用Jackson解析JSON最簡單的方法。可以從字元串、流或文件解析JSON,並創建Java對象或對象圖來表示已解析的JSON。將JSON解析為Java對象也稱為從JSON反序列化Java對象
1.JAVA對象轉JSON
ObjectMapper mapper = new ObjectMapper();
String bjectMapper = mapper.writeValueAsString(obj);
2.JSON轉Java類[JSON反序列化]
ObjectMapper mapper = new ObjectMapper();
HashMap<String, Object> inMap = mapper.readValue(jsonStr, HashMap.class);

7. 阿里的Json解析包FastJson使用

maven配置:

源碼地址

public static final Object parse(String text);

public static final JSONObject parseObject(String text);

public static final <T> T parseObject(String text, Class<T> clazz);

public static final JSONArray parseArray(String text);

public static final <T> List<T> parseArray(String text, Class<T> clazz);

public static final String toJSONString(Object object, boolean prettyFormat);

public static final Object toJSON(Object javaObject);

public static final String toJSONString(Object object);

8. Jackson序列化&&FastJson序列化API使用

JDK英文文檔,牆裂不推薦看中文!!!

ObjectMapper的API文檔

1 需要注意的是:

2 Jackson的API: `

3. Jackson提供的註解
Jackson 提供了一系列的註解,方便對 JSON 序列化和反序列化進行控制,下面介紹一些常用的註解:

1. 引入MAVEN依賴:

2. 實體類

3. 測試類:

首先注意的是 JDK1.8 中時間類,採用了一套新的API。

在這里我們採用是 LocalDate 類,若是 User 類中,沒有使用註解,那麼序列化結果為:

顯然,這不是我們預期的 Json 串。並且,我們在反序列化過族侍褲程中,會出現異常:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of java.time.LocalDate (no Creators, like default construct, exist):
cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"name":"小胖","sports":["足球","游泳"],"date":{"year":2019,"month":"MARCH","chronology":{"id":"ISO","calendarType":"iso8601"},"dayOfMonth":27,"dayOfWeek":"WEDNESDAY","dayOfYear":86,"era":"CE","monthValue":3,"leapYear":false}}"; line: 1, column: 43] (through reference chain: com.JsonSerializer.User["date"])

大概意思:就是 LocalDate 的沒有參數是 Object 的構造函數。不能實例化對象。

華麗的分割線 SpringBoot的處理

SpringBoot的解決方案:

Java bean的解決方案:
在 Java Bean 中使用註解,就可以進行反序列化和序列化。

執行結果:

FastJson 是性能極好的 JSON 解析器和生成器。

1. FastJson的優點:

2. FastJson的主要類:

1. FastJson的MAVEN依賴:

2. JSON准備:

ARR_JSON格式:

COMPLEX_JSON格式:

使用方式: github的使用文檔

1. 通過 TypeReference 處理泛型對象

2. 使用 getType() 可以獲取更好的性能。

1. TypeRefrence部分源碼分析:

為什麼這里的構造方法要是兆簡 protected 的,即我們無法直接創建該對象,只能使用匿名類創建 子類 對象。

getGenericSuperclass()的API方法

返回 Class 對象(類,介面,基本數據類型,void)的談閉直接父類的 Type 類型。
如果父類是 parameterized [pə'ræmɪtəraɪzd] 類型(也可以理解為 父類是泛型對象 ),那麼返回的參數類型是父類的泛型類型。

基本原理:

使用 public static <T> T parseObject(String text, Class<T> clazz) 方法,邊可完成JSON的反序列化。

1. 特殊JSON反序列化

2. 泛型丟失

我們可以看到,因為返回值需要泛型類型 T 所以我們採用的是 Class<T> ,防止返回Object對象,讓用戶強轉。但需要注意: 這種方式在反序列化的時候,會丟失泛型類型。

方式一:TypeReference

方式二:使用parseArray

我們可以通過這個 API ,完成 Bean 對象轉換成 String 類型。
String toJSONString(Object object, SerializerFeature... features)

若是對象的屬性只是簡單數據類型(基本數據類型,或者String類型)那麼可以使用Class方式轉化為Object對象。

若是一個對象裡面的屬性依舊是一個對象,那麼我們就可以使用TypeRefrence進行轉換。

我們在將JSON轉換為對象的時候,就可以保留List<T>的泛型。即:

參考文章:
Java下利用Jackson進行JSON解析和序列化

使用FastJson處理JSON數據

fastjson如何json數組串轉換為Object[]時如何指定各個數據項的數據類型

閱讀全文

與fastjson註解使用相關的資料

熱點內容
maya粒子表達式教程 瀏覽:84
抖音小視頻如何掛app 瀏覽:283
cad怎麼設置替補文件 瀏覽:790
win10啟動文件是空的 瀏覽:397
jk網站有哪些 瀏覽:134
學編程和3d哪個更好 瀏覽:932
win10移動硬碟文件無法打開 瀏覽:385
文件名是亂碼還刪不掉 瀏覽:643
蘋果鍵盤怎麼打開任務管理器 瀏覽:437
手機桌面文件名字大全 瀏覽:334
tplink默認無線密碼是多少 瀏覽:33
ipaddgm文件 瀏覽:99
lua語言編程用哪個平台 瀏覽:272
政采雲如何導出pdf投標文件 瀏覽:529
php獲取postjson數據 瀏覽:551
javatimetask 瀏覽:16
編程的話要什麼證件 瀏覽:94
錢脈通微信多開 瀏覽:878
中學生學編程哪個培訓機構好 瀏覽:852
榮耀路由TV設置文件共享錯誤 瀏覽:525

友情鏈接