Xml&json解析
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);
5.遍历JSONObject和JSONArray
// 获取groups键对应的值,并付给json对象
JSONObject groupsJsonobj = jsonObj.getJSONObject(SymbolConstants.GROUPS);
// 获取groups键指向的json对象的所有键
Iterator it = groupsJsonobj.keys();
String key = null;
JSONArray jsonArr = null;
JSONObject subJsonObj = null;
// 遍历groups键指向的json对象的每一个键
while (it.hasNext()) {
key = it.next().toString();
// 获取groups的key指向的JSONArray
jsonArr = groupsJsonobj.getJSONArray(key);
// 遍历jsonArr,获取每一个json对象
for (int i = 0; i < jsonArr.size(); ++i) {
subJsonObj = jsonArr.getJSONObject(i);
/*
*添加业务代码
*/
}
}