XML简介与解析
数据是主体
• 但是,单独的数据,它的含义很模糊
• 数据+含义,适用于传输数据,而不是显示数据(HTML)
example:
XML其实就是纯文本的表示
- 跨系统,平台,语言
- 核心就是意义+数据
W3C官网
取自W3C的一个书店示例
注意:
– 需要转义字符,如“<”需要用:“<”;(无引号)代替。
– 注释:XML Schema(XSD,XML Schema Definition)
– 定义 XML 文档的结构, DTD的继任者(DTD不做介绍了)
– 支持数据类型,可扩展,功能更完善、强大
– 采用xml编写
XSL
– 扩展样式表语言(eXtensible Stylesheet Language)
– XSL作用于XML,等同于CSS作用于HTML
可访问W3C官网学习XML
XML的解析
– 树结构
• DOM: Document Object Model 文档对象模型,擅长(小规模)读/写
– 流结构
• SAX: Simple API for XML 流机制解释器(推模式),擅长读
• Stax: The Streaming API for XML 流机制解释器(拉模式),擅长读,
JDK 6 引入
DOM
W3C 处理 XML 的标准 API
- 直观易用
- 但处理大量数据·时候有程序崩溃的风险
这一部分的内容没有上过,可课下自行了解
JSON简介
- JS对象的表示方法
- 比XML更加容易解析
- 推广到全部的语言(尽管它本身为JS的语法格式)
JSON是一种独立于编程语言的、轻量的、数据交换格式
JSON对象和JSON数组
• 名称/值对(K-V对)。
如"firstName":“John”
– JSON对象:{“name":“Jo”,“email”:“a@b.com”}
– 数据在键值对中
– 数据由逗号分隔
– 花括号保存对象
• JSON数组
– 方括号保存数组
[{“name":“Jo”,“email”:“a@b.com”}, {“name":“Jo”,“email”:“a@b.com”}]
Java的JSON处理方法
• org.json:JSON官方推荐的解析类
– 简单易用,通用性强
– 复杂功能欠缺
• GSON:Google出品
– 基于反射,可以实现JSON对象、JSON字符串和Java对象互转
• Jackson:号称最快的JSON处理器
– 简单易用,社区更新和发布速度比较快
综上考虑,Google的GSON更加好用
JSON和XML
• 都是数据交换格式,可读性强,可扩展性高
• 大部分的情况下,JSON更具优势(编码简单,转换方便),
而且JSON字符长度一般小于XML,传输效率更高
• XML更加注重标签和顺序
• JSON会丢失信息
相互转化标签的顺序可能会发生改变
只说一下GSON,其他两个具体可自行查早他们的文档阅读
文件目录
pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Java MOOC</groupId>
<artifactId>GSON</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
books2.json
[
{
"category": "COOKING",
"title": "Everyday Italian",
"author": "Giada De Laurentiis",
"year": "2005",
"price": 30
},
{
"category": "CHILDREN",
"title": "Harry Potter",
"author": "J K. Rowling",
"year": "2005",
"price": 29
},
{
"category": "WEB",
"title": "Learning XML",
"author": "Erik T. Ray",
"year": "2003",
"price": 39
}
]
//Book.class
public class Book {
private String category;
private String title;
private String author;
private String year;
private int price;
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getTitle(){
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor(){
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getYear() {
return year;
}
public int getPrice() {
return price;
}
public void setYear(String year) {
this.year = year;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString(){
return "Book[category="+category+",title="+title+",author="+author+",year="+year+",price="+price+"]";
}
}
//Person.class
import java.util.List;
public class Person{
private String name;
private int age;
private List<Integer> scores;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setScores(List<Integer> scores) {
this.scores = scores;
}
public List<Integer> getScores() {
return scores;
}
}
//***GsonTest.class
import java.io.File;
import java.io.FileReader;
import java.util.Arrays;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
public class GsonTest{
public static void main(String[] args) {
testJsonObject();
System.out.println("=========华丽丽的分割线哦================");
testJsonFile();
}
public static void testJsonObject(){
//构造函数
Person p=new Person();
p.setName("Gary");
p.setAge(20);
p.setScores(Arrays.asList(60,70,80));//调用setScore
//1.从Java对象到JSON字符串
Gson gson=new Gson();
String s=gson.toJson(p);//Person对象到Json字符串
System.out.println(s);
//2.反过来,Gson字符串到Java对象
Person p2=gson.fromJson(s,Person.class);
System.out.println(p2.getName());//Gary
System.out.println(p2.getAge());//20
System.out.println(p2.getScores());//60,70,80
//调用Gson的JsonObject
JsonObject json=gson.toJsonTree(p).getAsJsonObject();//像整个json解析为一棵树
System.out.println(json.get("name"));//Gary
System.out.println(json.get("age"));
System.out.println(json.get("scores"));
}
public static void testJsonFile(){
Gson gson=new Gson();
File file=new File("books2.json");
try(FileReader reader=new FileReader(file)){
List<Book>books=gson.fromJson(reader,new TypeToken<List<Book>>(){}.getType());//Json文件带Java对象数组(这就是GSON的强大的地方)
for(Book book:books)
{
System.out.println(book.getAuthor()+" ,"+book.getTitle());
}
}catch (Exception e){
e.printStackTrace();
}
}
}