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

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00267.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

爪哇咖啡屋 : [轉貼]JSONObject.toJSONString 把屬性的大小寫改變了

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]JSONObject.toJSONString 把屬性的大小寫改變了

JSONObject.toJSONString把屬性的大小寫改變了

版權聲明:本文為博主原創文章,支持轉載,但轉載時請務必在明顯位置,給出原文連接。 https://blog.csdn.net/john1337/article/details/84071790

JSONObject.toJSONString把屬性的大小寫改變了

class A{

//xxx
private String QKRQ;
//xxxx
private String QKDH;

}

本想把A對像通過fastjson序列化後傳給客戶端,但是傳到客戶端的數據卻並非自己想要的,QKRQ、QKDH這些屬性通過JSONObject.toJSONString序列化後變成了qKRQ、qKDH,研究了下通過@JSONField(name="QKRQ")設置後返回客戶端的屬性首字母就不會被小寫了!!

參考文章: https://blog.csdn.net/u010535345/article/details/50493498?locationNum=7&fps=1


原文出處:JSONObject.toJSONString把属性的大小写改变了 - johnhuster的专栏 - CSDN博客
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]JSON.toJSONString 會把 key 的首字母轉成小寫

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博客
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]fastjson 轉換 json 字符串 key 的首字母小寫變大寫的解決辦法

fastjson轉換json字符串key的首字母小寫變大寫的解決辦法

問題描述

在開發過程中,由於接口文檔的描述,要求json字符串的key首字母為大寫,而java 的規範要求在定義bean的時候,成員屬性是首字母小寫的駝峰格式,java的基本規範一定要遵守,否則會出現一些難以發現解決的基礎問題,例如本文中提到的,fastjson轉換json字符串key首字母大寫的問題。

根本原因: java 的內省機制


    內省(Introspector)是Java 語言對Bean類屬性、事件的一種缺省處理方法。例如類 A 中有屬性 name, 那我們可以通過 getName,setName 來得到其值或者設置新的值。通過 getName/setName 來訪問 name 屬性,這就是默認的規則。
一個類被當作javaBean使用時,JavaBean的屬性是根據方法名推斷出來的,它根本看不到java類內部的成員變量,通過去掉set方法前綴,然後取剩餘部分,如果剩餘部分的第二個字母是小寫的,則把剩餘部分的首字母改成小寫。
參考:http://blog.csdn.net/hahalzb/article/details/5972421

如何解決

在使用fastjson的時候,一般默認對像轉換成的字符串key的首字母是小寫的,而json字符串轉換成java bean對象的時候,json字符串怎麼寫的,封裝javabean的時候就要怎麼寫,這樣才能成功set值給javabean。如果需要將javabean轉換json字符串時key的首字母大寫可以使用fastjson 的註解 @JSONField,例如:


UserSynInfo {
/**
* 用戶Id
*
* 作為更新表的主鍵使用
*/

)
private Long userId;
/**
* 用戶暱稱
*/

)
private String nickName;
/**
* 用戶的NetId
*/

)
private Integer netId;
/**
* 用戶加入家庭時間,時間格式為標準時間戳格式,如2016-03-23 11:43:07
*/

)
private Date createTime;
/**
* 全同步不需要,單條同步需要
*/

)
private String sN;
/**
* 更新時間,時間格式為標準時間戳格式,如2016-03-23 11:43:07
*/

)
private String updateTime;
getUserId() {
return userId;
}
setUserId(Long userId) {
this.userId = userId;
}
getNickName() {
return nickName;
}
setNickName(String nickName) {
this.nickName = nickName;
}
getNetId() {
return netId;
}
setNetId(Integer netId) {
this.netId = netId;
}
getCreateTime() {
return createTime;
}
setCreateTime(Date createTime) {
this.createTime = createTime;
}
getUpdateTime() {
return updateTime;
}
setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
getsN() {
return sN;
}
setsN(String sN) {
this.sN = sN;
}
}

注意
在使用註解之前,一定要檢查自己封裝的成員屬性的規則是否符合java的基本規範,首字母小寫的駝峰格式,否則註解不會生效,不生效的原因,仍然是java的內省機制導致的。
這樣在轉換的時候就會發現:


        {
",
"123,
",
",
"10061
}

這樣的註解寫法不僅僅會在普通的對象轉換的時候生效,還可以在spring中生效。

當然,解決json字符串key首字母大寫的方式還可以正常定義javabean,將成員屬性定義成首字母大寫的(雖然不符合javabean的規範),然後使用google的gson,可以將javabean封裝的成員屬性原封不動的轉換成json字符串。


原文出處:fastjson转换json字符串key的首字母小写变大写的解决办法 - 雪夜里的孤狼 - CSDN博客
前一個主題 | 下一個主題 | 頁首 | | |



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