Json   发布时间:2022-04-22  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用JSONObject 深度序列化和反序列化大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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<student> 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<student> getstudents() {
		return students;
	}

	public void setstudents(List<student> 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<student> list = new ArrayList<student>();
		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","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来注明反序列化的各个类路径,如:

@H_540_31@map<String,Class<?>> clazz = new HashMap<String,Class<?>>(); clazz.put("student",student.class); clazz.put("students",student.class);可以使用toBean的重载方法设置clazz也可以通过jsonconfig的setClassmap(clazz);来设置

如果我有这么一个需求,在对象cs的基础上我要把jo的数据封装给它,这时候就要用到toBean的另一个重载方法

@H_372_37@map<String,student.class); JSONObject jo = JSONObject.fromObject("{'clsNum':'123','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','student':{'gerder':'F','way':'wentaoyuan1'}");
		JsonConfig jc = new JsonConfig();
		jc.setClassmap(clazz);
		
		Classes cls = (Classes) JSONObject.toBean(jo,jc);
		System.out.println(cls.getClsNum() + "==" + cls.getstudent().getAddress());
打印结果:

123==null

结论:深层次的对象如果不存在某属性,则会被覆盖掉。

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

请各位网友给与赐教,如何来解决这个问题?

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

大佬总结

以上是大佬教程为你收集整理的使用JSONObject 深度序列化和反序列化全部内容,希望文章能够帮你解决使用JSONObject 深度序列化和反序列化所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。