XML与Json解析实例
一、XML解析:
1、DOM4J解析XML
步骤
//1. 引入jar文件 dom4j.jar
//2. 获取输入流
FileInputStream fis = new FileInputStream("xml地址");
//3. 创建XML读取对象
SAXReader sr = new SAXReader();
//4. 读取并得到文档对象
Document doc = sr.read(fis);
//5. 通过文档获取根元素
Element root = doc.getRootElement();
文档对象 Document
指的是加载到内存的 整个XML文档.
常用方法:
1. 通过文档对象, 获取XML文档中的根元素对象
Element root = doc.getRootElement();
2. 添加根节点
Element root = doc.addElement("根节点名称");
元素对象 Element
指的是XML文档中的单个节点.
常用方法:
1. 获取节点名称
String getName();
2. 获取节点内容
String getText();
3. 设置节点内容
String setText();
4. 根据子节点的名称 , 获取匹配名称的第一个子节点对象.
Element element(String 子节点名称);
5. 获取所有的子节点对象
List<Element> elements();
6. 获取节点的属性值
String attributeValue(String 属性名称);
7. 获取子节点的内容
String elementText(String 子节点名称);
8. 添加子节点
Element addElement(String 子节点名称);
9. 添加属性
void addAttribute(String 属性名,String 属性值);
引入jar包:
- 项目下创建lib文件夹,并将jar包拷贝到文件夹下
- 项目配置
解析本地文件案例:
Demo01.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1001">
<name>金苹果</name>
<info>锄禾日当午,苹果很辛苦</info>
</book>
<book id="1002">
<name>银苹果</name>
<info>锄禾日当午,苹果很辛苦</info>
</book>
</books>
Demo01.java
//1. 获取输入流
FileInputStream fis = new FileInputStream("d://Demo01.xml");
//2. 创建XML读取对象
SAXReader sr = new SAXReader();
//3. 读取并得到文档对象
Document doc = sr.read(fis);
//4. 通过文档获取根元素
Element root = doc.getRootElement();
//5. 开始解析元素
System.out.println(root.getName());
List<Element> es = root.elements();
for (int i = 0; i < 2; i++) {
Element book = es.get(i);
System.out.println(book.attributeValue("id"));
System.out.println(book.elementText("name"));
System.out.println(book.elementText("info"));
System.out.println("------------------------");
}
fis.close();
运行结果:
解析网络文件案例:
网络XML资源
Demo02.java
//1. 获取到XML资源的输入流
URL url = new URL("http://apis.juhe.cn/mobile/get?phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
//2. 创建一个XML对象
SAXReader sr = new SAXReader();
//3. 通过读取对象,读取XML数据,并返回文档对象
Document doc = sr.read(is);
//4. 获取根节点
Element root = doc.getRootElement();
//5. 解析内容
String code = root.elementText("resultcode");
if("200".equals(code)){
Element result = root.element("result");
String province = result.elementText("province");
String city = result.elementText("city");
if(province.equals(city)){
System.out.println("手机号归属地为:"+city);
}else {
System.out.println("手机号归属地为:"+province+" "+city);
}
}else {
System.out.println("请输入正确的手机号码");
}
运行结果:
2、DMO4J - XPATH解析XML
路径表达式
通过路径快速的查找一个或一组元素
路径表达式:
1. / : 从根节点开始查找
2. // : 从发起查找的节点位置 查找后代节点 ***
3. . : 查找当前节点
4. .. : 查找父节点
5. @ : 选择属性. *
属性使用方式:
[@属性名='值']
[@属性名>'值']
[@属性名<'值']
[@属性名!='值']
books: 路径 //book[@id='1']//name
books
book id=1
name
info
book id=2
name
info
使用步骤:
通过Node类的两个方法, 来完成查找:
(Node是 Document 与 Element 的父接口)
方法1.
//根据路径表达式, 查找匹配的单个节点
Element e = selectSingleNode("路径表达式");
方法2.
List<Element> es = selectNodes("路径表达式");
案例:
Demo03.java
//1. 获取输入流
FileInputStream fis = new FileInputStream("d://Demo01.xml");
//2. 创建XML读取对象
SAXReader sr = new SAXReader();
//3. 读取并得到文档对象
Document doc = sr.read(fis);
//4. 通过文档对象+xpath,查找所有name节点
List<Node> names = doc.selectNodes("//book[@id='1001']//name");
for (int i = 0; i < names.size(); i++) {
System.out.println(names.get(i).getName());
System.out.println(names.get(i).getText());
}
fis.close();
运行结果:
二、JSON解析
作用:
- 将Java中的对象 快速的转换为 JSON格式的字符串.
- 将JSON格式的字符串, 转换为Java的对象.
Gson
- 将对象转换为JSON字符串
转换JSON字符串的步骤:
1. 引入JAR包
2. 在需要转换JSON字符串的位置编写如下代码即可:
String json = new Gson().toJSON(要转换的对象);
案例:
Book b = BookDao.find();
String json = new Gson().toJson(b);
System.out.println(json);
- 将JSON字符串转换为对象
步骤:
1. 引入JAR包
2. 在需要转换Java对象的位置, 编写如下代码:
对象 = new Gson().fromJson(JSON字符串,对象类型.class);
案例:
String json = "{\"id\":1,\"name\":\"金苹果\",\"author\":\"李伟杰
\",\"info\":\"嘿嘿嘿嘿嘿嘿\",\"price\":198.0}";
Book book = new Gson().fromJson(json, Book.class);
System.out.println(book);
FastJson
- 将对象转换为JSON字符串
转换JSON字符串的步骤:
1. 引入JAR包
2. 在需要转换JSON字符串的位置编写如下代码即可: String json=JSON.toJSONString(要转换的对象);
案例:
Book b = BookDao.find();
String json=JSON.toJSONString(b);
System.out.println(json);
- 将JSON字符串转换为对象
步骤:
1. 引入JAR包
2. 在需要转换Java对象的位置, 编写如下代码:
类型 对象名=JSON.parseObject(JSON字符串, 类型.class);
或
List<类型> list=JSON.parseArray(JSON字符串,类型.class);
案例:
String json = "{\"id\":1,\"name\":\"金苹果\",\"author\":\"李伟杰
\",\"info\":\"嘿嘿嘿嘿嘿嘿\",\"price\":198.0}";
Book book = JSON.parseObject(json, Book.class);
System.out.println(book);
实例:
1、引入jar包同XML解析中jar包的引入
2、代码编写
Book.java
public class Book {
private String id;
private String name;
private String info;
public Book() {
}
public Book(String id, String name, String info) {
this.id = id;
this.name = name;
this.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;
}
@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 + '\'' +
'}';
}
}
Gson
-
对象转Json字符串:
//1. 创建Gson对象 //2. 转换 Book b = new Book("100", "金苹果", "种植苹果真辛苦"); String s = new Gson().toJson(b); System.out.println(s);
运行结果
-
Json字符串转对象
//1. 创建Gson对象 Gson g = new Gson(); //2. 转换 : {"id":"100","name":"金苹果","info":"种植苹果真辛苦"} HashMap data = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植苹果真辛苦\"}", HashMap.class); System.out.println(data.get("id")); //2. 转换 : {"id":"100","name":"金苹果","info":"种植苹果真辛苦","page":["锄禾日当午","汗滴禾下土","嘿嘿嘿嘿嘿"]} HashMap data1 = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植苹果真辛苦\",\"page\":[\"锄禾日当午\",\"汗滴禾下土\",\"嘿嘿嘿嘿嘿\"]}", HashMap.class); //将数组转换为List List page = (List) data1.get("page"); System.out.println(page.get(0));
运行结果
FastJson
-
对象转Json字符串:
Book book = new Book("1002", "唐诗三百首", "床前明月光,地上鞋一堆,床上我杰哥,喊十块钱一双。"); //1. 转换 String str = JSON.toJSONString(book); System.out.println(str);
运行结果:
-
Json字符串转对象
//1. 转换 : {"id":"1002","info":"床前明月光,地上鞋一堆,床上我杰哥,喊十块钱一双。","name":"唐诗三百首"} Book book = JSON.parseObject("{\"id\":\"1002\",\"info\":\"床前明月光,地上鞋一堆,床上我杰哥,喊十块钱一双。\",\"name\":\"唐诗三百首\"}", Book.class); System.out.println(book.getId());
运行结果
-
Json字符串转数组
//1. 转换 : ["一二三","二三四","三四五"] List<String> strings = JSON.parseArray("[\"一二三\",\"二三四\",\"三四五\"]", String.class); System.out.println(strings.get(0));
运行结果