茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1729807 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00071.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2019/6/13 15:26:19

JSON.toJSONString會把key的首字母轉成小寫

fastjson將bean轉成字符串時首字母變小寫問題

一個項目需求要求返回值為JSON格式,且大多數字段是首字母大寫,還有些是類似N_TX這樣的格式,在輸出這樣的結果時遇到了問題,由於時間緊,就直接拷貝需要的結果字段建立JavaBean類,本以為最後直接調用JSON.toString(obj)返回結果即可,沒想到返回值中自動將首字母變小寫。查看fastjson源碼發現關鍵在下面一段

public static List<FieldInfo> computeGetters(Class<?> clazz, Map<String, String> aliasMap, boolean sorted) {
String propertyName;
if (Character.isUpperCase(c3)) {
if (compatibleWithJavaBean) {
propertyName = Introspector.decapitalize(methodName.substring(3));
} else {
propertyName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
}
} else if (c3 == '_') {
propertyName = methodName.substring(4);
} else if (c3 == 'f') {
propertyName = methodName.substring(3);
} else {

continue;
}}
compatibleWithJavaBean為false時直接get對應屬性首字母小寫,考慮將compatibleWithJavaBean初始化為true,發現
public static String decapitalize(String name) {
if (name == null || name.length() == 0) {
return name;
}
if (name.length() > 1 && Character. isUpperCase(name.charAt(1)) &&
Character. isUpperCase(name.charAt(0))){
return name;
}
char chars[] = name.toCharArray();
chars[0] = Character. toLowerCase
(chars[0]);
return new String(chars);
}
只能在連續的大寫字母情況下才不進行首字母變小寫操作。故此方法也不滿足要求。

最後找到以下解決方法:

public class User {

public String Name;

public int Age;

}



2、第一種方法不符合Java的命名規範,可以用第二種方法,在屬性上添加註解:

public class User {

@JSONField (value = "Name")

private String name;

@JSONField(value = "Age")

private int age;

}

3、自己利用反射寫Object2Json和list2Json方法,只要能對簡單的JavaBean類處理即可。


開始還想看下Fastjson的SerializerFeature序列化屬性是否能用上,最後還是沒找到合適的:

DisableCheckSpecialChar:一個對象的字符串屬性中如果有特殊字符如雙引號,將會在轉成json時帶有反斜槓轉移符。如果不需要轉義,可以使用這個屬性。默認為false
QuoteFieldNames———-輸出key時是否使用雙引號,默認為true
WriteMapNullValue——–是否輸出值為null的字段,默認為false

WriteNullNumberAsZero—-數值字段如果為null,輸出為0,而非null
WriteNullListAsEmpty—–List字段如果為null,輸出為[],而非null
WriteNullStringAsEmpty—字符類型字段如果為null,輸出為」「,而非null
WriteNullBooleanAsFalse–Boolean字段如果為null,輸出為false,而非null

原文出處:JSON.toJSONString会把key的首字母转成小写 - u010535345的博客 - CSDN博客
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|