java后台常用json解析工具問題小結
這里不細究造成這些問題的底層原因,只是單純的描述我碰到的問題及對應的解決方法
jackson將java對象轉json字符串字段字母小寫問題
在使用springmvc框架作為后台控制層層的框架時,我們都知道當前台發送ajax請求后台要返回一個json字符串時,我們要做3件事
- 引入jackson相關jar包
- springmvc配置文件配置相關json轉換配置
- Controller層的方法上加上@Response注解,方法返回值為對象
這樣當我們完成第三步,返回java對象之后,springmvc使用jackson將我們的對象轉為json返回給前台,一般情況下是任何問題都不會發生的,但是當我們返回的java對象,他的成員變量不符合java駝峰命名規范時,會出現問題,例如當成員變量名全部大寫,轉化的json對應字段卻是小寫
java類
//不符合變量命名規范的java類
public class SellPoint {
private String WT;
private String ZT;
//get/set ......略
}
//加注解之后的java類
public class SellPoint {
@JsonProperty("WT")
private String WT;
@JsonProperty("ZT")
private String ZT;
//get/set 方法加@JsonIgnore
}
轉化為json后
//不符合變量命名規范的java類轉化的json
"sellPoint": {
"wt": "送20M寬帶加電信電視(省內流量不限量,路由器、2部機頂盒免費送,預存400元)",
"zt": "送2T雲存儲空間;機頂盒免費用"
}
//加完注解后正常的json
"sellPoint": {
"WT": "送20M寬帶加電信電視(省內流量不限量,路由器、2部機頂盒免費送,預存400元)",
"ZT": "送2T雲存儲空間;機頂盒免費用"
}
解決方案:
- 在不規范的成員變量字段上加JsonProperty("期望的變量名稱")注解
- 在對應的get/set方法上添加@JsonIgnore注解,忽略正常的轉化
注意:如果不在get/set方法加@JsonIgnore注解,會生成兩份json屬性,如下:
"sellPoint": {
"wt": "送20M寬帶加電信電視(省內流量不限量,路由器、2部機頂盒免費送,預存400元)",
"zt": "送2T雲存儲空間;機頂盒免費用",
"WT": "送20M寬帶加電信電視(省內流量不限量,路由器、2部機頂盒免費送,預存400元)",
"ZT": "送2T雲存儲空間;機頂盒免費用"
}
fastjson將對象轉化為json字符串首字母小寫問題(未實踐)
解決方案一:
在Controller或service中初始化fastjson的一個參數(高版本(2.X)fastjson已經不適用)
static{
TypeUtils.compatibleWithJavaBean = true;
}
解決方案二:
新建fastjson.properties,添加如下配置
fastjson.compatibleWithJavaBean=true
解決方案三:
在對應字段上加@JSONField注解
//加注解之后的java類
public class SellPoint {
@JSONField("WT")
private String WT;
@JSONField("ZT")
private String ZT;
//get/set 忽略
}
ps:net.sf.json將對象轉化為json不會出現屬性名稱問題
net.sf.json的NoSuchMethodException: Unknown property XXXX
這個錯是使用net.sf.json將json字符串轉化為java對象時出現,出現的原因是Json字符串屬性過多,沒有對應上javaBean的屬性,所以程序會拋異常沒有對應的屬性。
解決方案是寫一個屬性過濾器
JsonConfig config = new JsonConfig();
config.setJavaPropertyFilter(new PropertyFilter(){
public boolean apply(Object paramObject1, String paramString,
Object paramObject2) {
//這里設置要過濾的屬性
if(paramString.equals("xxx")||paramString.equals("xxxx")){
return false;
}
return true;
}});
這種方式可以參考這篇博客
因為我的json屬性過多最終沒有采用net.sf.json,使用了fastjson,他在json轉java中,對於json中一些java沒有的屬性自動進行忽略