XML
简介:
XML是可扩展编辑语言(eXtensible Markup Language)的缩写,它是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据。
XML文档形成树状结构,在“根”和“叶子”的分支机构开始的。
-
使用嵌套结构的数据表示方式,支持格式验证;
-
常用于配置文件、网络消息传输等。
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book>
<name>java编程基础</name>
<info>Java开发基础</info>
</book>
</books>
-
特点:
- 纯文本,默认使用UTF-8编码。
- 可以嵌套,适合表示结构化数据。
- 如果把XML内容存为文件,那么,他就是一个XML文件,例如
book.xml
。 - XMl内容经常通常通过网络作为消息传输。
XML结构:
XML有固定的结构
首行必须是<?xml version="1.0" ?>
,可以加上可选的编码。
紧接着, 如果以类似<!DOCTYPE note SYSTEM "book.dtd">
声明的是文档定义类型(DTD:Dcocument Type Definition
),DTD是可选的。
接下来是XML的文档内容,一个XM文档有且仅有一个根元素,根元素可以包含任意个子元素,元素可以包含属性,例如,<book id="1001">java</book>
包含一个属性id="1001"
,且元素必须正确嵌套,如果是空元素,可以用 <tag/>
表示。
由于使用了 < > 以及引号等标识符,如果内容出现了特殊符号,需要使用 &???;
表示转义。例如,Java<tm>
必须写成:
<name>Java<tm></name>
常见的特殊字符如下:
DOM:
因XML是一种树形结构的文档,它有两种标准的解析API:
- DOM:一次性读取XML,并在内存中表示为树形结构;
- SAX:以流的形式读取XML,使用事件回调。
DOM是Document Object Model的缩写,DOM模型就是把XML结构作为一个树形结构处理,从根节点开始,每个节点都可以包含任意个子节点。
-
Document
:代表整个XML文档; -
Element
:代表一个XML元素; -
Attribute
:代表一个元素的某个属性。DOM可在内存中完整表示XML数据结构;
DOM解析速度慢,内存占用大。
SAX:
SAX是Simple API for XML的缩写,它是一种基于流的解析方式,边读取XML边解析,并以事件回调的方式让调用者获取数据。因为是一边读一边解析,所以无论XML有多大,占用的内存都很小。
-
SAX是一种流式解析XML的API;
-
SAX通过事件触发,读取速度快,消耗内存小;
-
调用方必须通过回调方法获得解析过程中的数据。
SAX解析会触发一系列事件:
startDocument
:开始读取XML文档;startElement
:读取到了一个元素,例如;characters
:读取到了字符;endElement
:读取到了一个结束的元素,例如;endDocument
:读取XML文档结束。
InputStream input = Main.class.getResourceAsStream("/book.xml");
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser();
saxParser.parse(input, new MyHandler());
关键代码SAXParser.parser()
除了需要传入一个InputStream
外,还需要传入一个回调对象个,这个丢向要继承自DefaultHandler
;
JSON:
JSON是JavaScript Object Notation 的缩写,它去除了所有JavaScript执行代码,只保留JavaScript的对象格式。
JSON作为数据传输的格式,有几个显著的优点:
-
JSON只允许使用UTF-8编码,不存在编码问题;
-
JSON只允许使用双引号作为key,特使字符用\转义,格式简单;
-
浏览器内置JSON支持,如果爸把数据用JSON发送给浏览器,可以用JavaScript直接处理。
因此,JSON适合表示层次结构,因为它格式简单,仅支持以下几种数据类型:
-
键值对:{“key”:value}
-
数组:[1,2,3]
-
字符串:“abc”
-
数值(整数和浮点数):12.34
-
布尔值:true或flase
-
空值:nul
浏览器直接支持使用JavaScript
对JSON进行读写:
// JSON string to JavaScript object:
jsObj = JSON.parse(jsonStr);
// JavaScript object to JSON string:
jsonStr = JSON.stringify(jsObj);
常用的用于解析JSON的第三方库有:
- Jackson
- Gson
- Fastjson
小结:
JSON
是轻量级的数据表示方式,常用于Web应用;
Jackson
可以实现JavaBean
和JSON
之间的转换;
可以通过Module
扩展Jackson
能处理的数据类型;
可以自定义JsonSerializer
和JsonDeserializer
来定制序列化和反序列化。
JSON解析:
步骤:
1、引入jar包
Java内部并没有关于JSON解析的内容,因此我们需要从外部引入相应的jar包文件。在引入的时候大家需要注意查看版本,尽量选择最新版以避免漏洞的危害,如阿里的FastJson1.2.69版本就存在一个高危漏洞,我这里使用的是1.2.70版本。大家也可以根据自己的要求来选择。
那么,关于引入jar包,第一步就是下载,
此处下载最新地址:
下载完之后在项目中创建一个lib文件夹
将下载好的jar包放进来,可根据自己的选择进行,我这里将两个包都放了进来:
此时,仔细看两个jar包都是无法展开的,现在进行下一步操作:
添加Java类库
选择项目,然后点击ok
此时,我们在点击lib文件夹,发现jar包可以展开了,说明添加成功,可以使用了。
将对象转换为JSON字符串
为了方便,创建一个Book类来备用:
public class Book {
String id;
String name;
String info;
public Book(String id, String name, String info) {
this.id = id;
this.name = name;
this.info = info;
}
public Book() {
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return Objects.equals(id, book.id) && Objects.equals(name, book.name) && Objects.equals(info, book.info);
}
@Override
public int hashCode() {
return Objects.hash(id, name, info);
}
@Override
public String toString() {
return "Book{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
Gson
转换JSON字符串的步骤:
1. 引入JAR包
2. 在需要转换JSON字符串的位置编写如下代码即可:
String json = new Gson().toJSON(要转换的对象);
案例:
public static void main(String[] args) {
//1.创建Gson对象
Gson g = new Gson();
//2.创建一个book对象
Book book = new Book("1001","java程序设计","java编程基础");
//3.将对象转换为Json字符串
String s = g.toJson(book);
System.out.println(s);
}
结果如下:
FastJson:
转换JSON字符串的步骤:
1. 引入JAR包
2. 在需要转换JSON字符串的位置编写如下代码即可:
String json=JSON.toJSONString(要转换的对象);
案例:
public static void main(String[] args) {
Book b = new Book("1001","安徒生童话","乔");
String s = JSON.toJSONString(b);
System.out.println(s);
}
结果如下:
将JSON字符串转换为对象
Gson
1. 引入JAR包
2. 在需要转换Java对象的位置, 编写如下代码:
对象 = new Gson().fromJson(JSON字符串,对象类型.class);
案例:
public static void main(String[] args) {
//1.创建Gson对象
Gson g = new Gson();
//2.将json字符串转换为对象
Book b = g.fromJson("{\"id\":\"1001\",\"name\":\"java程序设计\",\"info\":\"java编程基础\"}", Book.class);
System.out.println(b);
}
结果如下:
FastJson:
1. 引入JAR包
2. 在需要转换Java对象的位置, 编写如下代码:
类型 对象名=JSON.parseObject(JSON字符串, 类型.class);
或
List<类型> list=JSON.parseArray(JSON字符串,类型.class);
案例:
Book book = JSON.parseObject("{\"id\":\"1001\",\"info\":\"乔\",\"name\":\"安徒生童话\"}", Book.class);
System.out.println(book);
System.out.println(book.getId());
结果如下:
List<String> s = JSON.parseArray("[\"一二三\",\"二三四\",\"三四五\"]", String.class);
System.out.println(s.get(1));
结果如下:
另外,需要注意一点,如果使用HashMap类型 进行数组的转换,转换后的数组类型会变为ArrayList类型。