java get方法不序列化_Java中的Json序列化,不容忽视的getter
在開(kāi)發(fā)的過(guò)程中,經(jīng)常會(huì)碰到和自己預(yù)期不一樣的情況。有的時(shí)候自己去研究一下還是很有趣的。這兩天在寫java web的時(shí)候,碰到了一個(gè)對(duì)象序列化的問(wèn)題。
問(wèn)題重現(xiàn)
public class AjaxJson {
private boolean success;
private String msg;
private Object obj;
private Map attributes;
//getter and setter
public String getJsonStr() {
JSONObject obj = new JSONObject();
obj.put("success", this.isSuccess());
obj.put("msg", this.getMsg());
obj.put("obj", this.obj);
obj.put("attributes", this.attributes);
return obj.toJSONString();
}
}
上面是一個(gè)接口類,我們需要把這個(gè)類的對(duì)象序列化成json返回。那么在springmvc中,一般是這樣操作的。
@RequestMapping(params = "/get")
@ResponseBody
public AjaxJson del(HttpServletRequest request) {
AjaxJson json = new AjaxJson();
//省略業(yè)務(wù)操作
return json;
}
默認(rèn)的話,返回ResponseBody,對(duì)象會(huì)直接序列化成json。這個(gè)時(shí)候,我們可以看一下返回的json。
{
"success": "true",
"Msg":"1",
"obj":{
...
},
"attributes": null,
"jsonStr":"{"success": "true","Msg":"1","obj":{...},"attributes": null,}"
}
顯然,和我們預(yù)期想的不太一樣,多了一個(gè)jsonstr字段。這個(gè)時(shí)候我在想,是不是springmvc的問(wèn)題。結(jié)果仔細(xì)一想,springnvc之所以可以直接將對(duì)象序列化成json,其實(shí)是我們添加的配置文件在起作用,真正參與序列化工作的是jackson這個(gè)庫(kù)。于是,我單獨(dú)使用了jackson,結(jié)果返回的json字符串和之前是相同的,這下就可以肯定是,jackson這個(gè)庫(kù)本身的設(shè)計(jì)問(wèn)題了。
深入探討
帶著這份好奇,我把java中常用的json序列化的庫(kù)都試了一下,看看是否都是這樣。主流的庫(kù)有jackson、fastjson和gson。
經(jīng)過(guò)測(cè)試發(fā)現(xiàn),jackson和阿里的fastjson返回的json字符串都帶有一個(gè)jsonstr字段,唯獨(dú)google的gson返回了我們預(yù)期的結(jié)果——只序列化對(duì)象的field。
于是我找了下這幾個(gè)庫(kù)的序列化原理:
jackson和fastjson
在序列化的時(shí)候,先利用反射找到對(duì)象類的所有g(shù)et方法,接下來(lái)去get,然后小寫化,作為json的每個(gè)key值,而get方法的返回值作為value。接下來(lái)再反射field,添加到j(luò)son中。
gson
沒(méi)有找到通俗的講法,不過(guò)感覺(jué)應(yīng)該就和getter方法無(wú)關(guān)吧。
所以,可以看大我們的AjaxJson類中存在這樣一個(gè)getJsonStr,因此,jsonStr就作為key,序列化到j(luò)son中了。
當(dāng)然在jackson中,提供了相應(yīng)的annotation,可以把這類方法忽略掉。在方法前加上**@JsonIgnore **即可。
個(gè)人理解
遇到問(wèn)題的時(shí)候,千萬(wàn)不要忽略一些簡(jiǎn)單的地方,例如getter和setter方法。用getXXX的地方,可以用fetch等替代。
有時(shí)我們會(huì)在類中定義例如private int mAge的變量,而getter的方法是getAge()。顯然我們希望在序列化的時(shí)候得到的key為age而非mAge,那么反射getter方法也就有它存在的意義了。
參考文獻(xiàn)
總結(jié)
以上是生活随笔為你收集整理的java get方法不序列化_Java中的Json序列化,不容忽视的getter的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 翻页电子书/电子画册制作工具
- 下一篇: java byte md5_Java开发