java后台常用json解析工具問題小結


java后台常用json解析工具問題小結

這里不細究造成這些問題的底層原因,只是單純的描述我碰到的問題及對應的解決方法

jackson將java對象轉json字符串字段字母小寫問題

在使用springmvc框架作為后台控制層層的框架時,我們都知道當前台發送ajax請求后台要返回一個json字符串時,我們要做3件事

  1. 引入jackson相關jar包
  2. springmvc配置文件配置相關json轉換配置
  3. 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雲存儲空間;機頂盒免費用"
}

解決方案:

  1. 在不規范的成員變量字段上加JsonProperty("期望的變量名稱")注解
  2. 在對應的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沒有的屬性自動進行忽略


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM