每一种编程语言都有不同的数据结构,在多个应用程序之间,如果编写每一个应用程序的编程语言都不同,那么他们的数据是不能直接传递的,需要将他们转换为特定的格式,然后再进行传输,保证发送方和接收方都能正确的读取数据。
另外,不同操作系统,不同平台之间实现数据共享,也需要将数据转换为两个平台或者操作系统都能读取的格式。
数据交换格式就是“应用程序间通信时使用的数据格式”,而常见的数据交换格式包括:XML、JSON、YAML。
下面就是用Java来实现上面这3种格式的操作。
xml(eXtensible Markup Language),可扩展标记语言,详细的介绍可以自行查阅。
在xml中,有几个专业术语:
节点:比如上面的<books>、<book>、<name>、<price>、<language>、<author>;
节点值:比如"Effective Java" 是< name>节点的值;
属性:比如<book>节点的id属性;
属性值:<book>节点的id属性值分别为1、2.
注意,每一个节点都可以有子节点,比如<books>的子节点有<book>节点,而<book>的子节点包括<name>、<price>、<language>、<author>;
在使用Java来操作xml的时候,一般就是对于上面这几个内容进行处理,比如获取节点名称和及节点值、节点属性和属性值。Java常用XML解析方式有4种:DOM解析、SAX解析、DOM4J解析、JDOM解析。
在此之前,需要了解一下节点类型:
Java中内置了一些API来使用DOM方式解析xml。不需要另外导入其他jar包。
运行结果:
需要注意,使用DOM方式解析xml时,需要将整个xml文件都加载进内存,再进行解析。
其次,dom方式解析和我们在前端JavaScript DOM编程的方式很相似,可以参考JavaScript DOM编程艺术。
SAX方式和DOM方式有一个明显的区别:SAX方式是从上往下逐个解析的。
Java内置了使用SAX方式解析xml的API,所以不需要导入其他jar包。
使用SAX方式的解析xml,需要我们自己定义一个Handler(一个class),继承DefaultHandler,自己定义怎么去解析xml中的节点。
运行结果:
这里介绍几种构造json的方式:
使用JSONObject,可以将jsonobject对象、map集合、javabean对象中的数据转换为json格式。转换为json格式之后就可以进行传输了。
这种方式需要引入json-java的依赖;
如果使用maven可以自己根据上面的jar包下载地址设置依赖。
这种方式,就是先创建一个map,然后向map中put键和值,然后将map作为JSONObject构造方法的参数,然后得到的JSONObject对象就是包含了map数据的json。最后调动toString接口输出json。
运行结果和上一个代码的运行结果一样。
利用JavaBean来创建json,先创建一个javabean:
测试代码:
运行结果和前面的结果一样。
当我们在程序中接收到其他地方传过来的json格式数据的时候,可以使用JSONObject去读取数据中的内容。
json数据可以是别的应用程序传输过来的,也可以是本地生成的,或者是存储在文件中,无论什么样的方式,都可以将其转换为同一个的格式进行处理。
编写解析程序
上面使用gson将一个person对象转换为json时,注意,json中的key都是和person对象中的属性名相同的。如果遇到一些情况,我们的类中的属性名,不是和json中的key相同,那么需要使用一个@Ser注解。
在上面gson将person转换为json的代码,缩进之后输出如下:
上面的除了使用注解来实现设置json中属性对应的key值,另外,还可以使用gson提供的fieldNamingStrategy来设置json中key的名称。
前面的输出json内容都是经过手动缩进的,如果没有手动缩进,那么内容就是一个很长的字符串。
我们在调试的时候,一般都是会将json美化后输出,因为便于阅读,但在实际的生产环境中一般不会将json美化后传送。
虽然有很多的json格式化工具,但是gson中提供了接口,可以将json进行美化后输出(不用自己手动缩进了)
前面介绍了使用gson将javabean对象转换为json格式,通过使用gson还能将json格式的数据转换为javabean对象,并且,使用gson比是用JSONObject更加方便。
有些时候,我们一个类中的某个属性,不允许暴露给外界,但是前面的集中做法中,都是将所有的属性暴露给了外界,这是存在安全隐患的,在对象序列化的时候,也会存在这个问题,他们的解决方式相同,都是在属性的前面增加一个transient关键字,比如Person中的wage属性在序列化或者转换为json时,不允许暴露给外籍,可以这样声明wage属性:
fastjson是alibaba开源的一个项目,也是用来处理json的。他的用法和其他几种方式相似,这里只介绍一下常用的API。