XML&JSON解析
一、dom4j解析XML
1.dom4j的接口
接口名 | 描述 |
---|---|
Node | 所有的节点,是Document、Element、Text、Attribute、Branch等的父类型 |
Branch | 包含子节点的节点 |
Element | XML元素 |
Document | XML文档 |
Attribute | XML元素的属性,属性是放在尖括号内的 |
DocumentType | XML文档中 DOCTYPE |
Text | XML的文本节点 |
2.生成Document对象
- String类型XML
Document document = DocumentHelper.parseText(xmlStr);
- File类型的XML
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(file);
3.获取根节点并遍历节点
每一个Node都有getName()
、getNodeType()
、getNodeTypeName()
三个函数
获取根节点:Element root = document.getRootElement()
获取节点的迭代器和遍历该节点的直接子节点:
// 获取节点的迭代器
Iterator iterator = root.elementIterator();
while(iterator.hasNext()) {
Element element = (Element) iterator.next();
// 获取节点之间的内容
element.getText();
// 获取节点的指定子节点的内容
element.elementText("appid");
// 获取当前节点所在的路径
element.getPath();
// 获取一个元素的属性列表
element.attributes();
// 获取元素的所有直接子元素构成的List
element.elements();
// 获取元素指定属性名color的属性,返回的是一个Attribute对象
Attribute attribute = element.attribute("color");
// 获取属性的名和值
attribute.getName();
attribute.getValue();
}
4.获取节点的指定子节点
Element root = document.getRootElement();
// 获取根节点的名字为appid的子节点
Element subNode = root.element("appid");
二、dom4j生成XML
1.建立Document
Document document = DocumentHelper.createDocument();
2.给document添加(根)节点
Element root = document.addElement("xml");
3.在根节点root上添加节点和节点内容
root.addElement(key).addText(value);
或root.addElement(key).addCDATA(value);
CDATA 指的是不应由 XML 解析器进行解析的文本数据,某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。为了避免错误,可以将脚本代码定义为 CDATA
4.将document转为String格式的XML 或 直接生成xml文件
String xmlStr = document.asXML();
生成xml文件
//输出xml的路径
File xmlFile = new File("D:/out.xml");
FileOutputStream fos = new FileOutputStream(xmlFile);
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");//指定编码,防止写中文乱码
BufferedWriter bw = new BufferedWriter(osw);
//dom4j对xml输出格式化
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter out = new XMLWriter(bw, format);
out.write(document);
out.flush();
三、解析json串
1.创建json对象
JSONObject jsonObject = new JSONObject(jsonStr); // jsonStr格式是{}
JSONArray jsonArray = new JSONArray(jsonStr); // jsonStr格式是[{}, {}]
JSONArray subJsonArray = complexJsonArray.getJSONArray(0); // complexJsonArray 格式是[[{}, {}],{}]
2.获取json的数据并存到map
// 从JSONArray获取第0个JSONObject
JSONObject jsonObject = jsonArray.getJSONObject(0);
// 获取[{}, {}]的第一个元素的String格式
jsonArray.getString(0);
// 遍历JSONObject
Iterator<String> it = jsonObject.keys();
while (it.hasNext()) {
// 获取键
String key = it.next();
// 通过key获取三种类型的值
Object obj = jsonObject.get(key);
int num = jsonObject.getInt(key);
String value = jsonObject.getString(key);
map.put(key, value);
}
四、创建json格式数据
1.把数据存储到map
Map<String, Object> iMap = new HashMap<String, Object>();
2.map转json格式
JSONObject jsonObject = new JSONObject(map);
// 把map转为json
jsonStr = jsonObject.toString()
3.生成指定JSON数据Demo
{“address”:”中国”,”count”:70,”user”:{“name”:”liu”,”tel”:”12306”,”age”:11}}
// 方式一:
Map<String, Object> map = new HashMap<String, Object>();
// 放入键-值
map.put("address", "中国");
map.put("count", 70);
// 此时的jsonObject数据是:{"address":"中国","count":70}
JSONObject jsonObject = new JSONObject(map);
// 创建新的JSONObject:{\"name\":\"liu\", \"age\":11, \"tel\":\"12306\"}
JSONObject newJsonObject = new JSONObject();
newJsonObject.put("name", "liu");
newJsonObject.put("age", 11);
newJsonObject.put("tel", "12306");
// 把newJsonObject,放入jsonObject,生成最终数据
jsonObject.put("user", newJsonObject);
// 方式二:
Map<String, Object> map = new HashMap<String, Object>();
// 存放用户数据的map
Map<String, Object> userMap = new HashMap<String, Object>();
// 在userMap中存放键值对,构造user JSONObject
userMap.put("name", "liu");
userMap.put("tel", "12306");
userMap.put("age", 11);
// 把address、count参数和userMap一起放到Map中,构造JSONObject
map.put("address", "中国");
map.put("count", 70);
map.put("user", userMap);
JSONObject jsonObject = new JSONObject(map);
注意:org.json没有内置方法将Java Bean转为JSONObject。net.sf.json有内置转换方法将Java Bean转为JSONObject。在引用net.sf.json的maven配置时,一定要补上<classifier>jdk15</classifier>
<!-- 完整的net.sf.json依赖配置 -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
4.生成JSONArray
// 方式一:将多个JSONObject依次put到JSONArray中
JSONArray jsonArray = new JSONArray();
jsonArray.put(jsonObject1);
jsonArray.put(jsonObject2);
// 方式二:用字符串直接new,jsonArrayStr的格式是:[{},{}]
JSONArray jsonArray = new JSONArray(jsonArrayStr);