日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

java get方法不序列化_Java中的Json序列化,不容忽视的getter

發(fā)布時(shí)間:2023/12/20 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java get方法不序列化_Java中的Json序列化,不容忽视的getter 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在開(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。