数据的格式
TXT:(非结构化数据 类似toString()格式):Student{name="张三",age=22,gender="女"}
CSV:张三,22,女(需要额外提供分隔符)
JSON:{name:"张三",age:22,gender:"女"}(只需要使数据符合JSON的结构)
引入架包的方式
定义
将架包缓存一份到内存中,所有web资源在External Libraries中查看。
Project structure - Libraries - 添加所需架包的.jar文件
解析
依赖
dom4j-1.6.1.jar
jaxen-1.1.6.jar
配置文件解析
Properties(小型配置)
在config
包下创建一个datasource.properties
文件,properties类型数据以键值对存在。
name=henry
age=18
gender=female
class Properties extends HashTable<Object,Object>{}
("HashTable就是线程安全的HashMap。")
Properties prop = new Properties();
prop.load(new FileReader("config/datasource.properties"));// prop装载流
final String name = prop.getProperty("name");
final String age = prop.getProperty("age");
final String gender = prop.getProperty("gender");
由于读取和写入数据需要通过流来实现,通过创建一个字符输入流,读取指定路径下的文件内容,通过load()
方法来加载流中的数据,并将其解析成键值对的形式,存储在Properties
对象中,最后在通过getProperty(String keyword)
的方式获取值。
Xml解析(大型配置)
定义:XML是一种描述数据的标记语言,使用标签来定义数据的结构和内容。
- 字节类型
- 对标签
必须且只能有一个根节点,根节点的形式必须是对标签。
在<>中输入/就会自动补全
<students>
</students>
- 自闭合标签
<student/>
- 标签内容
属性
标签名字空格之后,以attr ="value"形式存在
<students>
<student id="yb12211_01" in_date="2022-10-01"/>
</students>
内容
在对标签之间可以存放内容
<students>
<student id="yb12211_01" in_date="2022-10-01">
<name>henry</name>
<age>18</age>
</student>
</students>
即可以在对标签之内循环嵌套对标签,一般不超过3层。
两种标签都可以有属性(多个属性之间用空格分隔 attr = "value"的形式存在),只有对标签可以有内容(文本|子标签)
解析路径
绝对路径
以
/
开始,直至结束("/students(根节点名称)/student[@'属性或内容']")相对路径
以//
开始,直接面向需要找的节点("//student(所需节点名称)")
限定属性
xpath[@attr='v1'] [@attr='v2'] [subLabel[@attr3]] (如果没有值即说明有属性就行)
限定文本
xpath[text()='v1'] [subLabel[text()='v2']]
一个中括号内只能有一种限定,限定可以有并列和嵌套关系。
- 解析元素(解析节点时会将换行符视为空标签,于是通过解析元素的方式来解决这个问题,通过select解析之后返回值是node,而需要通过强转获取元素。)
SAXReader sr = new SAXReader();
final Document xmlDoc = sr.read(new FileReader(String xmlFilePath));//传入xml文件的相对路径
final Node node = xmlDoc.selectSingleNode(String xpath);
final List<Element> list = xmlDoc.selectNodes(String xpath);
Element ele = ...
String attrVal = ele.attributeValue(String keyName);// 提取自身属性值
String txt = ele.getText();// 提取自身内容(文本值)
提取子元素对象:
所有子元素 :List<Element> subElement = ele.Elements();
获取指定的子元素:Element subEle = ele.element(String subElementName);
String subEleAttr = subEle.attrbuteValue(String attrName);
String subEleText = subEle.getText();
提取子元素的内容(文本值):String txt = ele.elementText(String subElementName);
- 当数据格式不适合xml,json等已有类型,可能需要构造新的类型以及解析器
读取xml文件
Document(文档)是指XML文档的实例,通过Document对象我们可以操作XML文档的内容,是在内存中表示和操作XML数据的数据结构。Document是所有数据读取的起点。
与反射类比,通过document获取有固定格式的xml数据,相当于通过字节码文件获取有固定格式的类数据。
public static void main(String[] args) throws FileNotFoundException, DocumentException {
SAXReader sr = new SAXReader();
final Document xmlDoc = sr.read(new FileReader("config/datasource.xml"));// 包含了xml文件的所有信息,xml文件和Document文件存在着文件的内存与磁盘间的映射关系
/**
* 找到id=yb12211_01的学生并输出其in_date属性值
*/
final Node node = xmlDoc.selectSingleNode("/students/student[@id='yb12211_02'][age[text()='22']]");// 表达式是由json准备的,如果表达式可能筛选出多个节点,xmlDoc.selectNode(),如果只能筛选出单个节点,sml.selectSingleNode()。返回值是node,一个节点代表了一个标签。
if(null != node){
Element ele = (Element) node;
final String inDate = ele.attributeValue("in_date");
final Element name = ele.element("name");// 获取子标签对象name
final String firstName = name.elementText("firstName");
final String lastName = name.elementText("lastName");
// final String name = ele.elementText("name");// ele.elementText()获取一级子元素,获取子标签name的文本内容
final String age = ele.elementText("age");
final String salary = ele.elementText("salary");
System.out.println("in_date属性值:"+inDate);
// System.out.println(name);
System.out.println(String.format("%s%s",firstName,lastName));
System.out.println(age);
System.out.println(salary);
}else{
System.out.println("no node found");
}
}
Json解析(可跨平台数据交互)
定义
"{}"->在json对象的基础上,添加双引号,并在其中去掉所有值的双引号,得到json字符串
用json字符串去看json对象
前端json对象传到后端,先变成一个json字符串,然后再反向解析成json对象
{}:表示对象,可以嵌套(对象的属性是对象)
jsonString:"{
"name":"herry","age":18,"hobby":["beauty","money","power"],"address":{
"province":"jiangsu","city":"nanjing","county":"pukou","detail":"..."}}"//{对象 []数组
jsonObject:{name:"herry",age:18,hobby:["beauty","money","power"],address:{province:"jiangsu",city:"nanjing",county:"pukou",detail:"..."}
jackson
jackson框架是结合spring框架,基于java平台的一套数据处理工具
jackson框架包含了三个核心库:streaming,datamind,annotations
fastjson
fastjson.jar常用于个人开发
可以方便的实现Json对象与JavaBean对象的转化
实现JavaBean对象与Json字符串的转化
实现Json对象与Json字符串的转换
final String jsonStr = JSON.toJSONString(T t); final T t = JSON.parseObject(jsonStr,Class<T> class);