https://blog.csdn.net/erbao_2014/article/details/53688934java
問題描述
在開發過程當中,因爲接口文檔的描述,要求json字符串的key首字母爲大寫,而java 的規範要求在定義bean的時候,成員屬性是首字母小寫的駝峯格式,java的基本規範必定要遵照,不然會出現一些難以發現解決的基礎問題,例如本文中提到的,fastjson轉換json字符串key首字母大寫的問題。spring
根本緣由: java 的內省機制
json
內省(Introspector)是Java 語言對Bean類屬性、事件的一種缺省處理方法。例如類 A 中有屬性 name, 那咱們能夠經過 getName,setName 來獲得其值或者設置新的值。經過 getName/setName 來訪問 name 屬性,這就是默認的規則。this
一個類被看成javaBean使用時,JavaBean的屬性是根據方法名推斷出來的,它根本看不到java類內部的成員變量,經過去掉set方法前綴,而後取剩餘部分,若是剩餘部分的第二個字母是小寫的,則把剩餘部分的首字母改爲小寫。
參考:http://blog.csdn.net/hahalzb/article/details/5972421
google
如何解決
在使用fastjson的時候,通常默認對象轉換成的字符串key的首字母是小寫的,而json字符串轉換成java bean對象的時候,json字符串怎麼寫的,封裝javabean的時候就要怎麼寫,這樣才能成功set值給javabean。若是須要將javabean轉換json字符串時key的首字母大寫可使用fastjson 的註解 @JSONField,例如:
.net
public class UserSynInfo {
/**
* 用戶Id
*
* 做爲更新表的主鍵使用
*/
@JSONField(name="UserId")
private Long userId;
/**
* 用戶暱稱
*/
@JSONField(name="NickName")
private String nickName;
/**
* 用戶的NetId
*/
@JSONField(name="NetId")
private Integer netId;
/**
* 用戶加入家庭時間,時間格式爲標準時間戳格式,如2016-03-23 11:43:07
*/
@JSONField(name="CreateTime",format="yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 全同步不須要,單條同步須要
*/
@JSONField(name="SN")
private String sN;orm
/**
* 更新時間,時間格式爲標準時間戳格式,如2016-03-23 11:43:07
*/
@JSONField(name="UpdateTime",format="yyyy-MM-dd HH:mm:ss")
private String updateTime;對象
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public Integer getNetId() {
return netId;
}
public void setNetId(Integer netId) {
this.netId = netId;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public String getsN() {
return sN;
}
public void setsN(String sN) {
this.sN = sN;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
注意
在使用註解以前,必定要檢查本身封裝的成員屬性的規則是否符合java的基本規範,首字母小寫的駝峯格式,不然註解不會生效,不生效的緣由,仍然是java的內省機制致使的。
這樣在轉換的時候就會發現:blog
{
"CreateTime": "2016-03-23 11:43:07",
"NetId": 123,
"NickName": "你猜",
"UpdateTime": "2016-03-23 11:43:07",
"UserId": 10061
}
1
2
3
4
5
6
7
這樣的註解寫法不單單會在普通的對象轉換的時候生效,還能夠在spring中生效。接口
固然,解決json字符串key首字母大寫的方式還能夠正常定義javabean,將成員屬性定義成首字母大寫的(雖然不符合javabean的規範),而後使用google的gson,能夠將javabean封裝的成員屬性原封不動的轉換成json字符串。