91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用FastJSON怎么智能字段

發布時間:2021-06-18 14:15:18 來源:億速云 閱讀:238 作者:Leah 欄目:開發技術

本篇文章為大家展示了使用FastJSON怎么智能字段,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

復現

@Data
static class Label {
 @JSONField(name = "label_id")
 private Integer labelId;
 private String labelName;
}
public static void main(String[] args) {
 String value = "{'labelId': 1,'label_name':'name'}";
 Label label = JSON.parseObject(value, Label.class);
 System.out.println(label);
}

低版本

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

使用低版本FastJSON,如上使用1.2.60版本,示例輸出的結果如下,即兩個字段JSON解析映射成功。雖然JavaBean中的字段和JSON中的key并不完全匹配(大小寫不匹配以及下劃線匹配),但得益于FastJSON的智能匹配,忽略了大小寫和下劃線,依然將JSON映射成功。

Label(labelId=1, labelName=name)

高版本

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

使用高版本FastJSON,如上使用1.2.71,示例輸出結果如下,字段labelId映射失敗,即高版本FastJSON對智能匹配規則做了修改,并且未向前兼容而導致了部分字段映射失敗導致了這次的bug。

Label(labelId=null, labelName=name)

原理

解析高版本FastJSON字段智能匹配失敗的原因,首先要先了解智能匹配的規則。

低版本

低版本的智能匹配規則的關鍵代碼如下,翻譯成人話就是:

1、如果JavaBean字段有@JSONField注解且name不空時,則對name的值忽略字母大小寫和-,_兩個字符

2、否則取JavaBean的字段名,忽略字母大小寫和-,_兩個字符

3、JSON中的key忽略is開頭并忽略剩余字母大小寫和-,_兩個字符

// 對JSON中沒有成功映射JavaBean的key做智能匹配
// 1. 忽略key的字母大小寫和'-','_'兩個字符
long smartKeyHash = TypeUtils.fnv1a_64_lower(key);
if (this.smartMatchHashArray == null) {
    long[] hashArray = new long[sortedFieldDeserializers.length];
    for (int i = 0; i < sortedFieldDeserializers.length; i++) {
        // fieldInfo.name優先取@JSONField的name字段,其次取JavaBean字段名
        // fieldInfo.name忽略字母大小寫和'-','_'兩個字符嘗試與JSON中的key做智能匹配
        hashArray[i] = TypeUtils.fnv1a_64_lower(sortedFieldDeserializers[i].fieldInfo.name);
    }
    Arrays.sort(hashArray);
    this.smartMatchHashArray = hashArray;
}
int pos = Arrays.binarySearch(smartMatchHashArray, smartKeyHash);
// 2. 如果key以'is'開頭,則忽略'is'開頭并忽略剩余字母大小寫和'-','_'兩個字符
boolean is = false;
if (pos < 0 && (is = key.startsWith("is"))) {
    smartKeyHash = TypeUtils.fnv1a_64_lower(key.substring(2));
    pos = Arrays.binarySearch(smartMatchHashArray, smartKeyHash);
}

使用FastJSON怎么智能字段

高版本

高版本的智能匹配規則的關鍵代碼如下,翻譯成人話就是:

1、如果JavaBean字段有@JSONField注解且name不空時,則取name的值

2、否則取JavaBean的字段名,忽略字母大小寫和-,_兩個字符

3、JSON中的key忽略is開頭并忽略剩余字母大小寫和-,_兩個字符

if (this.smartMatchHashArray == null) {
    long[] hashArray = new long[sortedFieldDeserializers.length];
    for (int i = 0; i < sortedFieldDeserializers.length; i++) {
        // 1. @JSONField的name不空時取該值直接與JSON中的key做匹配
        // 2. 取JavaBean字段名忽略字母大小寫和'-','_'兩個字符嘗試與JSON中的key做智能匹配
        hashArray[i] = sortedFieldDeserializers[i].fieldInfo.nameHashCode;
    }
    Arrays.sort(hashArray);
    this.smartMatchHashArray = hashArray;
}
// 對JSON中沒有成功映射JavaBean的key做智能匹配
// 1. 直接匹配
long smartKeyHash = TypeUtils.fnv1a_64_extract(key);
int pos = Arrays.binarySearch(smartMatchHashArray, smartKeyHash);
// 2. 忽略key的字母大小寫和'-','_'兩個字符
if (pos < 0) {
    long smartKeyHash2 = TypeUtils.fnv1a_64_lower(key);
    pos = Arrays.binarySearch(smartMatchHashArray, smartKeyHash2);
}
// 3. 如果key以'is'開頭,則忽略'is'開頭并忽略剩余字母大小寫和'-','_'兩個字符
boolean is = false;
if (pos < 0 && (is = key.startsWith("is"))) {
    smartKeyHash = TypeUtils.fnv1a_64_lower(key.substring(2));
    pos = Arrays.binarySearch(smartMatchHashArray, smartKeyHash);
}
// 優先取@JSONField的name字段直接與JSON中的key做匹配
// 其次取JavaBean字段名忽略字母大小寫和'-','_'兩個字符嘗試與JSON中的key做智能匹配
private long nameHashCode64(String name, JSONField annotation)
{
    if (annotation != null && annotation.name().length() != 0) {
        return TypeUtils.fnv1a_64_extract(name);
    }
    return TypeUtils.fnv1a_64_lower(name);
}

使用FastJSON怎么智能字段

區別

高版本與低版本的智能匹配規則差異就是:如果JavaBean字段有@JSONField注解且name不空時,低配版對name的值會忽略字母大小寫和-,_兩個字符,而高版本則直接取name的值不會做忽略操作。

因此示例中加了@JSONField注解的labelId字段才會因為FastJSON版本不同而導致反序列化結果的不同。

在對FastJSON的最新幾個版本挨個排查后定位出智能匹配規則發生修改的版本為1.2.71,所以如果代碼中使用了智能匹配,那么建議謹慎升級到1.2.71及其更高的版本。

另外這么明顯的未向前兼容的規則修改,應該有很多人會踩坑。于是去FastJSON的GitHub上查看后果然已經有人提出了issues:1.2.71以上版本加了JSONField的字段無法反序列化。

FastJSON解析數據,字段數據不匹配問題

FastJSON中@JSONField注解使用

有個聯通的數據要解析出來存入數據庫,但是提供過來的json數據有特殊符號'.','-',之前想著直接把特殊的字符給替換掉,解析出來

有一種是可以在實體類上加注解來替換轉出來的

fastjson的key是根據javabean里面的getter和setter方法來的,不是根據屬性名的,所以會出現這個問題,你在屬性的get和set方法上面寫上標注,說明轉成什么就行了比如 @JSONField(name=”SOMETHING”)

之前想的是替換到json數據里面的特殊字符,然后把實體類的.-都替換掉,這樣就可以創建實體類對象了,然后在用fastjson轉成對象

后來知道有fastjson的注解的@JSONField(name="name.age-12"來映射上實體類的)

上述內容就是使用FastJSON怎么智能字段,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁德市| 孝感市| 桃园市| 海口市| 韩城市| 宜川县| 和田市| 阿克苏市| 刚察县| 旺苍县| 冕宁县| 武汉市| 资溪县| 莎车县| 孟州市| 义乌市| 勃利县| 湾仔区| 江安县| 台湾省| 金溪县| 始兴县| 麻栗坡县| 靖江市| 双流县| 临沧市| 沙河市| 通辽市| 孙吴县| 河间市| 深州市| 额敏县| 榕江县| 安阳市| 昌平区| 买车| 双柏县| 德州市| 临城县| 嘉黎县| 桐乡市|