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","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 深度序列化和反序列化的更多相关文章

  1. 深度剖析PHP序列化和反序列化

    序列化 序列化格式 在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构. 序列化函数原型如下: string serialize ( mixed $value ) 先看下面 ...

  2. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  3. 【原】iOS动态性(四):一行代码实现iOS序列化与反序列化(runtime)

    为取得更好的排版效果,本文同样发布在简书上,强烈建议跳转到[1]http://www.jianshu.com/p/fed1dcb1ac9f 一.变量声明 为便于下文讨论,提前创建父类Biology以及 ...

  4. C#序列化及反序列化Json对象通用类JsonHelper

    当今的程序界Json大行其道.因为Json对象具有简短高效等优势,广受广大C#码农喜爱.这里发一个序列化及反序列化Json对象通用类库,希望对大家有用. public class JsonHelper ...

  5. Newtonsoft.Json 序列化和反序列化 时间格式

    From : http://www.cnblogs.com/litian/p/3870975.html 1.JSON序列化 string JsonStr= JsonConvert.SerializeO ...

  6. Newtonsoft.Json 的序列化与反序列化

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...

  7. WCF初探-24:WCF序列化和反序列化

    前言 WCF包含很多封装的内部机制,这些是我们在编写程序时不会经常看到的.比如上一篇讲解的Message.这一篇我将讲解WCF的另一种内部机制,WCF的序列化和反序列化.通常我们在编写WCF服务程序的 ...

  8. 第一章 JacksonUtil 序列化与反序列化属性总结

    1.json-lib与Jackson 关于json-lib与Jackson对比总结如下: 1).性能方面,Jackson的处理能力高出Json-lib10倍左右. 2).json-lib已经停止更新, ...

  9. 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化

    [源码下载] 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化 作者:webabcd 介绍重新想象 Windows 8 Store Apps ...

随机推荐

  1. VC++常见错误原因解析--error LNK2019: 无法解析的外部符号 "public: void __thiscall

    根据个人遇到这个错误时的记录,原因可以分为一下几种: 原因一: 只是在.h里面声明了某个方法, 没有在cpp里面实现 . 具体讲,有时候在头文件中声明了需要的方法,确实忘记了在源文件中实现: 有时候在 ...

  2. vscode使用教程(web开发)

    1.安装 进入官网下载https://code.visualstudio.com/ 一直下一步就好了,中间可以选择把软件安装在哪个目录. 2.常用插件安装 a. 进入扩展视图界面安装/卸载 a1.快捷 ...

  3. python自动化--语言基础线程、生产者消费者示例

    进程与线程的区别:进程不共享空间,线程共享地址空间 线程共享空间优缺点:优点:多线程给用户的体验好些,打开时占用的内存比进程少缺点:共享地址空间会相互干扰,甚至有影响 import threading ...

  4. Fiddler——抓包工具的使用

    fiddler安装 pc端安装fiddler,自行从百度下载即可 Fiddler是强大且好用的Web调试工具之一,它能记录客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输 ...

  5. linux使用crontab实现PHP执行计划定时任务

    linux使用crontab实现PHP执行计划定时任务 前几天写过一篇文章,利用单纯的php实现定时执行任务,但是效率不佳,对于linux来说用crontab实现更加合理 首先说说cron,它是一个l ...

  6. R中矩阵运算

    # 数据产生 # rnorm(n, mean = 0, sd = 1) 正态分布的随机数(r 代表随机,可以替换成dnorm, pnorm, qnorm 作不同计算.r= random = 随机, d ...

  7. centos7服务器安装fail2ban配合Firewalld防护墙防止SSH爆破与防护网站CC攻击

    centos7服务器安装fail2ban配合Firewalld防护墙防止SSH爆破与防护网站CC攻击 1.检查firewalld是否启用 #如果您已经安装iptables建议先关闭 service i ...

  8. 梦想CAD控件安卓参数绘图

    在CAD绘图中,参数化绘图可以帮助我们极大缩短设计时间,用户可以按照设计意图控制绘图对象,这样即使对象发生了变化,具体的关系和测量数据仍将保持不变,能够对几何图形和标注进行控制,可以帮助用户应对耗时的 ...

  9. vue组件---自定义事件

    首先简单回顾下组件事件及组件的复用 demo1:按钮事件 <div class="button_area"> <button-area></butto ...

  10. ThinkPHP---TP功能类之公文管理功能2----------继续完善

    [前言] 之前已经完成了公文的添加和列表展示功能,今天继续完善.做下公文的编辑和删除功能. [主体] (1)分析 控制器:DocController.class.php 方法:edit(将模板展示和数 ...