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

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

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);
    } 
只能在連續的大寫字母狀況下才不進行首字母變小寫操做。故此方法也不知足要求。 

最後找到如下解決方法:api

一、直接將bean對象中的屬性改成public,屬性名命名爲首字母大寫,好比{"Name":"nomouse","Age":12},定義相應的bean爲:熟悉爲public,不須要定義get方法spa

public class User {對象

    public String Name;ci

    public int Age;字符串

}get



二、第一種方法不符合Java的命名規範,能夠用第二種方法,在屬性上添加註解:源碼

public class User {string

  @JSONField  (value = "Name")it

private String name;

@JSONField(value = "Age")

private int age;

}

三、本身利用反射寫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





相關文章
相關標籤/搜索