博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用JSONObject 深度序列化和反序列化
阅读量:6917 次
发布时间:2019-06-27

本文共 4034 字,大约阅读时间需要 13 分钟。

JSONObject 和JSONArray 是json-lib.jar里面最经常使用的两个类,分别能够对对象和数组(集合)进行序列化和反序列化,结构清晰命了,简单易用,功能强大,效率比較高,使用至今一直较为推崇,尽管尚有诸多功能尚未全然了解,姑且边学边记,以作归纳、沉淀。

首先看两个类:

Student类:

public class Student {	private String name;	private String gerder;	private String address;	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public String getGerder() {		return gerder;	}	public void setGerder(String gerder) {		this.gerder = gerder;	}	public String getAddress() {		return address;	}	public void setAddress(String address) {		this.address = address;	}}
Classes类:

public class Classes {	private String clsNum;	private String claName;	private String way;	private List
students; private Student student; public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public String getClsNum() { return clsNum; } public void setClsNum(String clsNum) { this.clsNum = clsNum; } public String getClaName() { return claName; } public void setClaName(String claName) { this.claName = claName; } public String getWay() { return way; } public void setWay(String way) { this.way = way; } public List
getStudents() { return students; } public void setStudents(List
students) { this.students = students; }}
值得注意的是:Classes类中。既包括Student对象,也包括List<Student> 这种集合,这是为了让我么接下来的操作更有深度些:

測试类:MyTest

public class MyTest {	public static void main(String[] args) {		Student student = new Student();		student.setName("zxl");		student.setGerder("M");		student.setAddress("beijing");		Classes cs = new Classes();		cs.setClaName("计算机1");		cs.setClsNum("07060341");		cs.setWay("wentaoyuan1");		List
list = new ArrayList
(); list.add(student); cs.setStudents(list); cs.setStudent(student);}}
这时我们的cs对象已经封装好了,接下来进行序列化:

System.out.println(JSONObject.fromObject(cs).toString());

结果:{"claName":"计算机1","clsNum":"07060341","student":{"address":"beijing","gerder":"M","name":"zxl"},"students":[{"address":"beijing","gerder":"M","name":"zxl"}],"way":"wentaoyuan1"}

看以看到序列化是深度没有问题。全部的字段包含嵌套(姑且这么叫)的对象的字段也都完好了。看以称之为“彻底的序列化”。

接下来看一下反序列化:

JSONObject jo = JSONObject.fromObject("{'clsNum':'123','claName':'计算机1','student':{'address':'guangzhou','gerder':'F','name':'zxl'},'students':[{'address':'shanghai','gerder':'M','name':'zxl'}],'way':'wentaoyuan1'}");Classes cls = (Classes) JSONObject.toBean(jo, Classes.class);System.out.println(cls.getClsNum() + "==" + cls.getStudent().getAddress());
结果:123==guangzhou

也没有问题。

注:当嵌套的对象较多时。看以写一个Class Map来注明反序列化的各个类路径,如:

Map

>> clazz = new HashMap<String, Class<?

>>(); clazz.put("student", Student.class); clazz.put("students", Student.class);

能够使用toBean的重载方法设置clazz也能够通过jsonconfig的setClassMap(clazz);来设置

假设我有这么一个需求。在对象cs的基础上我要把jo的数据封装给它。这时候就要用到toBean的还有一个重载方法:

Map
> clazz = new HashMap

>>(); clazz.put("student", Student.class); clazz.put("students", Student.class); JSONObject jo = JSONObject.fromObject("{'clsNum':'123','claName':'计算机1','student':{'address':'guangzhou','gerder':'F','name':'zxl'},'students':[{'address':'shanghai','gerder':'M','name':'zxl'}],'way':'wentaoyuan1'}"); JsonConfig jc = new JsonConfig(); jc.setClassMap(clazz); Classes cls = (Classes) JSONObject.toBean(jo, cs, jc);

这时候有个问题了,当jo中的属性clsNum不存在的时候。会出现什么问题呢?

实验证明。当某个属性不存在的时候,该属性的值不被覆盖,等于cs原有的值。

当jo中student中的属性,address不存在的时候,会不会也是上面的那个情况呢?

JSONObject jo = JSONObject				.fromObject("{'clsNum':'123','claName':'计算机1','student':{'gerder':'F','name':'zxl'},'students':[{'address':'shanghai','gerder':'M','name':'zxl'}],'way':'wentaoyuan1'}");		JsonConfig jc = new JsonConfig();		jc.setClassMap(clazz);				Classes cls = (Classes) JSONObject.toBean(jo, cs, jc);		System.out.println(cls.getClsNum() + "==" + cls.getStudent().getAddress());
打印结果:

123==null

结论:深层次的对象假设不存在某个属性。则会被覆盖掉。

那么能不能让它跟一级属性一样,不进行覆盖呢?我认为应该是能够实现的,这个问题当然要着落在jsonConfig上,上面有非常多设置。大多数我还没有看明确,因此临时不知道怎么办?但假设这个功能是由我来设计,我一定会设置这么一个开关,默认覆盖深层次的属性,当然能够调整回来。

请各位网友给与赐教。怎样来解决问题?

其它关于Json-lib的文章,将在接下来的博文中陆续呈现。

转载地址:http://iqxcl.baihongyu.com/

你可能感兴趣的文章
再现一分钱中标,中国电信拿下海南政务云项目
查看>>
文件服务器之二:FTP服务器(pureftp)
查看>>
30分钟快速搭建门店智能监控视频分析
查看>>
解决drbd不能启动问题(Can not load the drbd module.)
查看>>
简单的RIP实验
查看>>
4星|《哈佛商业评论》2017年11期:高质量基础管理对企业的重要性不亚于卓越的战略思考。...
查看>>
ssh端口转发(之kettle ssh方式连接数据库)
查看>>
出现错误,显示事务没有回滚
查看>>
2、权限、变量、for 学习笔记
查看>>
Centos6安装配置rsync+inotify实时单向同步
查看>>
Cisco系列路由器密码恢复研究与实践
查看>>
顺时针打印矩阵
查看>>
Linux 2 unit5 LVM创建
查看>>
函数定义、函数的参数、函数的默认参数
查看>>
javaScript显示和隐藏(display属性)
查看>>
采用管道进行通讯的例子
查看>>
ubuntu添加一个源
查看>>
Oracle动态采样学习
查看>>
安全跟踪升级
查看>>
JavaScript从作用域到闭包
查看>>