JAVA JSON数据处理
数据的几种形式
举个栗子:Book
对象,有两个属性,name
和info
。XML(出现早,使用少,可读性强)和JSON(出现晚,使用多,传输数据量小)是常见的数据格式。
JAVA
class Book{
private String name;
private String info;
get/set/...
}
Book book = new Book();
book.setName("Fire");
book.setInfo("火");
JavaScript
var book = new Object();
book.name = "Fire";
book.info = "火";
XML
<book>
<name>Fire</name>
<info>火</info>
</book>
JSON
键值对方式存数据,{}表示一对象,[]表示数据,键值对的值可以是JS中的任意类型的数据
{
"name":"Fire",
"info":"火"
}
XML解析
JAVA中有四种解析:SAX
, DOM
, JDOM
, DOM4J
。
SAX
是逐行解析。DOM
, JDOM
, DOM4J
是全读到内存中。
数据样本
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book id="65001">
<name>金苹果</name>
<info>锄禾日当午</info>
</book>
<book id="936">
<name>银苹果</name>
<info>汗滴禾下土</info>
</book>
<book id="12306">
<name>铜苹果</name>
<info><![CDATA[!bin=/bash;#此 CDATA 部分中的所有内容都会被解析器忽略]]></info>
</book>
</books>
DOM4J
getRootElement()
: 通过文档获取根元素
attributeValue("id")
: 获取id属性值
elementText("name")
: 获取子节点name , 并获取它的内容
// 1,获取输入流
FileInputStream fis = new FileInputStream("data/book.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> elements = root.elements();
for (Element book : elements) {
//1. 获取id属性值
System.out.println(book.attributeValue("id"));
//2. 获取子节点name , 并获取它的内容
System.out.println(book.elementText("name"));
//3. 获取子节点info , 并获取它的内容
System.out.println(book.elementText("info"));
//分隔符
System.out.println("--------------------------");
}
fis.close();
DOM4J XPATH
通过路径快速的查找一个或一组元素。
路径表达式:
- / : 从根节点开始查找
- // : 从发起查找的节点位置 查找后代节点 ***
- . : 查找当前节点
- .. : 查找父节点
- @ : 选择属性. *
属性使用方式:
[@属性名=‘值’]
[@属性名>‘值’]
[@属性名<‘值’]
[@属性名!=‘值’]
// 1,获取输入流
FileInputStream fis = new FileInputStream("data/book.xml");
// 2,创建xml读取对象
SAXReader sr = new SAXReader();
// 3,读取并得到文档对象
Document doc = sr.read(fis);
// 4,通过Node类的两个方法, 来完成查找
//查多个
List<Node> nodes = doc.selectNodes("//book[@id='12306']//name");
for (Node n : nodes) {
System.out.println(n.getName());
System.out.println(n.getText());
}
fis.close();
XML写出
Random random = new Random();
// 1. 通过文档帮助器 (DocumentHelper) , 创建空的文档对象
Document doc = DocumentHelper.createDocument();
// 2. 通过文档对象, 向其中添加根节点
Element books = doc.addElement("books");
// 3. 通过根节点对象root , 丰富我们的子节点
for (int i = 0; i < 5; i++) {
Element book = books.addElement("book");
book.addAttribute("id", random.nextInt(5000) + i + "");
Element name = book.addElement("name");
name.setText("Book:" + i);
Element info = book.addElement("info");
info.setText("Info:Something written down here.");
}
// 4. 创建一个文件输出流 ,用于存储XML文件
FileOutputStream fos = new FileOutputStream("data/out-book.xml");
// 5. 将文件输出流, 转换为XML文档输出流
XMLWriter xw = new XMLWriter(fos);
// 6. 写出文档
xw.write(doc);
System.out.println("data/out-book.xml 已写出");
// 7. 释放资源
xw.close();
JSON解析
目前使用最多的是
Goole's Gson
和Alibaba's FashJSON
。话不多说,上代码。
Gson
需要创建对象进行下一步操作。
import com.google.gson.Gson;
import java.util.HashMap;
/**
* @version 1.0
* @Author: lyd
* @Description:
* @Date Created in 2021-03-06 16:23
* @Modified By: lyd
*/
public class Demo6 {
public static void main(String[] args) {
//1,创建Gson对象
Gson gson = new Gson();
//2,转换成JSON格式
Book book = new Book("Fire","to introduce fire.");
String s = gson.toJson(book);
System.out.println(s);
//3,转回对象 {"name":"Fire","info":"to introduce fire.","page":["对酒当歌","人生几何"]}
Book book1 = gson.fromJson("{\"name\":\"Fire\",\"info\":\"to introduce fire.\"}", Book.class);
System.out.println(book1.getInfo());
HashMap hashdata = gson.fromJson("{\"name\":\"Fire\",\"info\":\"to introduce fire.\",\"page\":[\"对酒当歌\",\"人生几何\"]}", HashMap.class);
System.out.printf("name:%s, info:%s, page[type:%s]:%s\n",hashdata.get("name"),hashdata.get("info"),hashdata.get("page").getClass(),hashdata.get("page"));
// name:Fire, info:to introduce fire., page[type:class java.util.ArrayList]:[对酒当歌, 人生几何]
}
}
FastJSON
直接调用静态方法
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.List;
/**
* @version 1.0
* @Author: lyd
* @Description:
* @Date Created in 2021-03-06 16:23
* @Modified By: lyd
*/
public class Demo7 {
public static void main(String[] args) {
//fastjson
//调用静态方法,转换成JSON格式
Book book = new Book("Fire","to introduce fire.");
String s = JSON.toJSONString(book);
System.out.println(s);
//调用静态方法,转回对象 {"name":"Fire","info":"to introduce fire.","page":["对酒当歌","人生几何"]}
Book book1 = JSON.parseObject("{\"info\":\"to introduce fire.\",\"name\":\"Fire\"}",Book.class);
System.out.println(book1.getInfo());
HashMap hashdata = JSON.parseObject("{\"name\":\"Fire\",\"info\":\"to introduce fire.\",\"page\":[\"对酒当歌\",\"人生几何\"]}", HashMap.class);
System.out.printf("name:%s, info:%s, page[type:%s]:%s]\n",hashdata.get("name"),hashdata.get("info"),hashdata.get("page").getClass(),hashdata.get("page"));
// name:Fire, info:to introduce fire., page[type:class com.alibaba.fastjson.JSONArray]:["对酒当歌","人生几何"]
// 数据数组 ["一二三","四五六","七八九"]
List<String> strings = JSON.parseArray("[\"一二三\",\"四五六\",\"七八九\"]", String.class);
System.out.println(strings.get(1));
}
写在最后
本期就这些内容,如有不对请多指教
附件
- dom4j-1.6.1.jar
- fastjson-1.2.70.jar
- gson-2.8.6.jar
- jaxen-1.1-beta-7.jar
- junit-4.8.jar
- xstream-1.3.1.jar
怎么上传文件呐= =