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没有的属性自动进行忽略