使用JSONObject 深度序列化和反序列化
2017-05-24 19:37
127 查看
JSONObject 和JSONArray 是json-lib.jar里面最经常使用的两个类,分别能够对对象和数组(集合)进行序列化和反序列化,结构清晰命了,简单易用,功能强大,效率比較高,使用至今一直较为推崇,尽管尚有诸多功能尚未全然了解,姑且边学边记,以作归纳、沉淀。
首先看两个类:
Student类:
Classes类:
值得注意的是:Classes类中。既包括Student对象,也包括List<Student> 这种集合,这是为了让我么接下来的操作更有深度些:
測试类:MyTest
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"}
看以看到序列化是深度没有问题。全部的字段包含嵌套(姑且这么叫)的对象的字段也都完好了。看以称之为“彻底的序列化”。
接下来看一下反序列化:
结果:123==guangzhou
也没有问题。
注:当嵌套的对象较多时。看以写一个Class Map来注明反序列化的各个类路径,如:
假设我有这么一个需求。在对象cs的基础上我要把jo的数据封装给它。这时候就要用到toBean的还有一个重载方法:
这时候有个问题了,当jo中的属性clsNum不存在的时候。会出现什么问题呢?
实验证明。当某个属性不存在的时候,该属性的值不被覆盖,等于cs原有的值。
当jo中student中的属性,address不存在的时候,会不会也是上面的那个情况呢?
123==null
结论:深层次的对象假设不存在某个属性。则会被覆盖掉。
那么能不能让它跟一级属性一样,不进行覆盖呢?我认为应该是能够实现的,这个问题当然要着落在jsonConfig上,上面有非常多设置。大多数我还没有看明确,因此临时不知道怎么办?但假设这个功能是由我来设计,我一定会设置这么一个开关,默认覆盖深层次的属性,当然能够调整回来。
请各位网友给与赐教。怎样来解决问题?
其它关于Json-lib的文章,将在接下来的博文中陆续呈现。
首先看两个类:
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","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<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的还有一个重载方法:
Map<String, Class<?>> clazz = new HashMap<String, Class<? >>(); 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的文章,将在接下来的博文中陆续呈现。
相关文章推荐
- 使用JSONObject 深度序列化和反序列化
- C#使用DataContractJsonSerializer实现Json格式的序列化和反序列化
- mvc “使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值” 解决经历
- JsonTools(java Json序列化/反序列化)简单使用
- 使用Json.Net处理json序列化和反序列化接口或继承类
- 使用DataContractJsonSerializer类将类型实例序列化为JSON字符串和反序列化为实例对象
- ASP.NET中JSON的序列化和反序列化使用说明
- 在MVC中使用Json.Net序列化和反序列化Json对象
- 使用json-lib完成json的序列化和反序列化
- 使用Newtonsoft.Json序列化和反序列化对象(源码)
- ASP.NET:使用Newtonsoft.Json序列化和反序列化JSON对象的例子
- C# 使用JSON对数据序列化和反序列化.
- 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性
- 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值
- 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性
- 使用序列化和反序列化机制深度复制对象 (转)
- 解决“使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错”的问题
- 使用NewtonSoft.JSON.dll来序列化和反序列化对象
- JavaScriptSerializer序列化和反序列化JSON:使用自定义JavaScriptConverter
- [C#] 使用 DataContractJsonSerializer 序列化 反序列化