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

在開發的過程中,經常會碰到和自己預期不一樣的情況。有的時候自己去研究一下還是很有趣的。這兩天在寫java web的時候,碰到了一個對象序列化的問題。

問題重現

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();

}

}

上面是一個接口類,我們需要把這個類的對象序列化成json返回。那么在springmvc中,一般是這樣操作的。

@RequestMapping(params = "/get")

@ResponseBody

public AjaxJson del(HttpServletRequest request) {

AjaxJson json = new AjaxJson();

//省略業務操作

return json;

}

默認的話,返回ResponseBody,對象會直接序列化成json。這個時候,我們可以看一下返回的json。

{

"success": "true",

"Msg":"1",

"obj":{

...

},

"attributes": null,

"jsonStr":"{"success": "true","Msg":"1","obj":{...},"attributes": null,}"

}

顯然,和我們預期想的不太一樣,多了一個jsonstr字段。這個時候我在想,是不是springmvc的問題。結果仔細一想,springnvc之所以可以直接將對象序列化成json,其實是我們添加的配置文件在起作用,真正參與序列化工作的是jackson這個庫。于是,我單獨使用了jackson,結果返回的json字符串和之前是相同的,這下就可以肯定是,jackson這個庫本身的設計問題了。

深入探討

帶著這份好奇,我把java中常用的json序列化的庫都試了一下,看看是否都是這樣。主流的庫有jackson、fastjson和gson。

經過測試發現,jackson和阿里的fastjson返回的json字符串都帶有一個jsonstr字段,唯獨google的gson返回了我們預期的結果——只序列化對象的field。

于是我找了下這幾個庫的序列化原理:

jackson和fastjson

在序列化的時候,先利用反射找到對象類的所有get方法,接下來去get,然后小寫化,作為json的每個key值,而get方法的返回值作為value。接下來再反射field,添加到json中。

gson

沒有找到通俗的講法,不過感覺應該就和getter方法無關吧。

所以,可以看大我們的AjaxJson類中存在這樣一個getJsonStr,因此,jsonStr就作為key,序列化到json中了。

當然在jackson中,提供了相應的annotation,可以把這類方法忽略掉。在方法前加上**@JsonIgnore **即可。

個人理解

遇到問題的時候,千萬不要忽略一些簡單的地方,例如getter和setter方法。用getXXX的地方,可以用fetch等替代。

有時我們會在類中定義例如private int mAge的變量,而getter的方法是getAge()。顯然我們希望在序列化的時候得到的key為age而非mAge,那么反射getter方法也就有它存在的意義了。

參考文獻

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453611.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453611.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql 通過echo的方式寫入數據庫 中文亂碼解決方案

echo "set names utf8;insert into xxx (path, sn, time, flag) values ($wav, $sn, $secs, op);" | MYSQL echo "set names utf8;insert into xxx (path, sn, time, flag) values ($wav, $sn, $secs, op);" 前面增加 set names utf8;

getParameter和getAttribute的區別

轉自http://blog.csdn.net/java_xiaobin/article/details/45363897 1.getAttribute是取得jsp中 用setAttribute設定的attribute 2.parameter得到的是string;attribute得到的是object 3.request.getParameter()方法傳遞的數據,會從Web客戶端傳到Web服務器…

java int字母,從Java中獲取int,也包含字母

How can I get the int value from a string such as 423e - i.e. a string that contains a number but also maybe a letter?Integer.parseInt() fails since the string must be entirely a number.解決方案Unless youre talking about base 16 numbers (for which theres …

Spring-data-jpa常用方法

轉載于:https://www.cnblogs.com/summary-2017/p/7904926.html

面試問題匯總 精選 分析 解答 職業規劃 part 1

C/C/C#面試題精選(1) 題目(一):C中我們可以用static修飾一個類的成員函數,也可以用const修飾類的成員函數(寫在函數的最后表示不能修改成員變量,不是指寫在前面表示返回值為常量&am…

java byte md5_Java開發網 - byte[]按自定義編碼轉換成String(MD5)

差不多了,這樣應該就可以了,剩下的就是擴展能接受的類型了。import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class HashPasswords {public String getPassword(byte[] input) {byte[] digest;synchronized (…

Java線程生命周期

當你需要使用Java線程在多線程環境下進行編程時,理解Java的線程周期與線程的狀態是非常重要的。通過實現Runnale接口或者繼承Thread類,我們可以創建線程,為了啟動一個線程,我們需要創建一個Thread對象,并且調用它的sta…

轉,JSON解析2

JSON 使用講解 這篇文章講解了,JSON的介紹以及使用GSON解析。今天,我們就在Android項目中使用兩種方式解析JSON數據。如果你對JSON,還不熟悉,那么請看JSON 使用講解。 一.搭建服務以及制造JSON數據。 1.服務器選擇的Tomcat&#x…

面試問題匯總 精選 分析 解答 職業規劃 part 2

面試困惑問與答(2)——感覺挺好,為啥被拒了? 問:技術面試的時候,題目挺簡單的,我覺得自己都做出來了。可最后怎么還是被拒了啊? 答:面試被拒有很多種可能,比…

js順序加載

2019獨角獸企業重金招聘Python工程師標準>>> js想要順序加載&#xff0c;分開js代碼塊&#xff0c;jsp頁面在加載的時候&#xff0c;是順序加載&#xff0c;遇到<script></script>代碼塊&#xff0c;先加載完成&#xff0c;然后繼續往下&#xff0c;遇到…

java swingworker_Java中的SwingWorker

L&#xff06;F物質的輸出(因為您對EDT的不確定性有待測試)run:JButton openDialog >>> Is there EDT ??? trueWorker started >>> Is there EDT ??? falsewaiting 30secondsWorker endeded >>> Is there EDT ??? falsebefore JOptionP…

持續交付與滾動升級

介紹 持續交付是頻繁對軟件應用程序持續更新的概念. 這個想法使在大量頻繁的更新面前, 你不必等待在一個指定的特殊時間點, 并且使你的組織在響應過程中變得更好. 一些 Ansible 用戶每小時都在部署更新給他們的最終用戶甚至更加頻繁 – 每時每刻都有代碼修改的批準. 要實現這一…

2-05 使用固態存儲SSD或PCIe卡

在大量并發的情況下&#xff0c;才能體現固態磁盤的吞吐量&#xff0c;在大并發下提供良好隨機io的性能&#xff0c;這正是關系型數據庫所需要的&#xff0c;相對應機械磁盤&#xff0c;固態磁盤更容易損壞&#xff08;第三點是固態磁盤的缺點&#xff09;&#xff0c;由于固態…

面試問題匯總 精選 分析 解答 職業規劃 part 3

《劍指Offer——名企面試官精講典型編程題》已經出版 非常感謝博客上的讀者&#xff0c;是大家的關心、支持和鼓勵讓我有信心寫完這本書并最終出版發行&#xff08; china-pub互動網、 亞馬遜卓越網、 淘寶網、 京東網、 當當網上有售&#xff09;。網友們的鼓勵讓我在 博客上的…

java 分布式rpc框架_分布式RPC框架Apache Dubbo(一)

4 Dubbo快速入門Dubbo作為一個RPC框架&#xff0c;其最核心的功能就是要實現跨網絡的遠程調用。本小節就是要創建兩個應用&#xff0c;一個作為服務的提供方&#xff0c;一個作為服務的消費方。通過Dubbo來實現服務消費方遠程調用服務提供方的方法。4.1 服務提供方開發開發步驟…

輕松獲知數據庫事務

標題索引事務作用事務流程隔離級別實例驗證事務作用事務是確保數據庫系統數據的完整性的功能&#xff0c;如現在互聯網行業支付業務&#xff0c;不管服務器出于什么原因異常中斷&#xff0c;客戶要么支付成功要么支付不成功&#xff0c;支付成功數據庫金額即會發生變化&#xf…

Python冒泡排序(4)

Python代碼&#xff1a; """ 冒泡排序&#xff08;4&#xff09;在未排序的數中&#xff0c;通過兩兩比較[換位]的方式&#xff0c;將最小的數移至首位 N個數排序&#xff0c;則需要執行N-1輪&#xff0c;第1輪比較N-1次&#xff0c;后續每輪比上一輪少比較1次本…

打印hello world java_java – 如何打印“hello world”?

數字4946144450195624適合64位&#xff0c;其二進制表示為&#xff1a;10001100100100111110111111110111101100011000010101000該程序對每5位組的字符進行解碼&#xff0c;從右到左00100|01100|10010|01111|10111|11111|01111|01100|01100|00101|01000d | l | r | o | w | | o…

研發人員為什么留不住

研發人員為什么留不住&#xff1f;(1)——問題與現象 研發團隊做為公司的核心&#xff0c;承擔了完成項目為公司賺錢的目的。研發人員在公司倍受重視的同時&#xff0c;并沒有降低流失率。 問題與現象 以下問題相信您會在朋友口中&#xff0c;甚至自己的公司聽到。 老板說&a…

算法與編程--1

1、編寫一個程序&#xff0c;將a.txt文件中的單詞與b.txt文件中的單詞交替合并到c.txt文件中&#xff0c;a.txt文件中的單詞用回車符分隔&#xff0c;b.txt文件中用回車或空格進行分隔。 package com.test;import java.io.File; import java.io.FileNotFoundException; import …