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.mzph.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 …