public static void main(String[] args) {
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<customer>\n" +
" <id>100</id>\n" +
" <name>lanying</name>\n" +
" <age>29</age>\n" +
" <books>\n" +
" <book>\n" +
" <id>1</id>\n" +
" <name>三国演义</name>\n" +
" <price>100.0</price>\n" +
" </book>\n" +
" <book>\n" +
" <id>2</id>\n" +
" <name>红楼梦</name>\n" +
" </book>\n" +
" <book>\n" +
" <id>1</id>\n" +
" <price>100.0</price>\n" +
" </book>\n" +
" <book>\n" +
" <name>西游记</name>\n" +
" <price>50.0</price>\n" +
" </book>\n" +
" </books>\n" +
"</customer>";
String data = XmlToJsonUtil.xmlToJson(xml);
JSONObject jsonObj = JSONObject.parseObject(data);
System.out.println("jsonObj = " + jsonObj);
// 层层解析
JSONObject customer = jsonObj.getJSONObject("customer");
System.out.println("customer = " + customer);
JSONObject books = customer.getJSONObject("books");
System.out.println("books = " + books);
JSONArray jsonArr = books.getJSONArray("book");
System.out.println("book = " + jsonArr);
for(int i = 0; i < jsonArr.size(); i ++){
JSONObject book = jsonArr.getJSONObject(i);
System.out.println(book.toJSONString());
}
}
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.*;
import java.util.List;
public class XmlToJsonUtil {
/*
* xml转json
*/
public static String xmlToJson(String xml) {
try {
// xmlStr ==> Document
Document doc = DocumentHelper.parseText(xml);
// Document ==> jsonStr
Element rootEle = doc.getRootElement();
JSONObject json = new JSONObject();
dom4j2Json(rootEle, json);
// 为了让JSON中包含根元素的key,才创建了resultJSON对象
JSONObject resultJSON = new JSONObject();
resultJSON.put(rootEle.getName(), json);
return resultJSON.toJSONString();
} catch (DocumentException e) {
System.out.println("数据解析失败"); // 可改为打印日志
}
return null;
}
/**
* 将element里面的内容存入参数json中
*
* @param element
* @param json
*/
private static void dom4j2Json(Element element, JSONObject json) {
// Step 1: 如果有属性 形如:<XXX attr="xxx">张三</XXX>
for (Object o : element.attributes()) {
Attribute attr = (Attribute) o;
if (!isEmpty(attr.getValue())) {
json.put("@" + attr.getName(), attr.getValue()); // key前加@存入参数json 形如:{"@attr":"value"},可自定义存入格式
}
}
// 获取element的子一级元素
List<Element> childElements = element.elements();
// Step 2: 形如:<name>张三</name>
if (childElements.isEmpty() && !isEmpty(element.getText())) { // 如果没有子元素,只有一个值
json.put(element.getName(), element.getText());
}
// Step 3: 子元素 e是element的子一级元素
for (Element e : childElements) { // element有子元素
if (e.elements().isEmpty()) { // 子元素e没有子元素(子子元素)
// attr
for (Object o : e.attributes()) {
Attribute attr = (Attribute) o;
if (!isEmpty(attr.getValue())) {
json.put("@" + attr.getName(), attr.getValue());
}
}
// <name>张三</name>
if (!isEmpty(e.getText())) {
json.put(e.getName(), e.getText());
}
} else { // 子元素也有子元素
JSONObject childJson = new JSONObject();
dom4j2Json(e, childJson); // 递归,将e中的数据存入childJson
Object o = json.get(e.getName()); // 通过这个子元素e的key从参数json中获取内容
if (o == null) { // 说明json中没有存入过该类型的子元素,则当前的childJson作为第一个元素存入参数json
if (!childJson.isEmpty()) {
json.put(e.getName(), childJson);
}
} else { // json中已经存入过该类型的子元素,说明不止一个,需要转成数组形式存入参数json
JSONArray jsonArr = null;
if (o instanceof JSONObject) { // 当前o是之前存入的子元素,即"第一个子元素"
JSONObject jsonObj = (JSONObject) o;
json.remove(e.getName()); // 删除之前的JSONObject(稍候以JSONArray形式存入)
jsonArr = new JSONArray(); // 新建JSONArray
jsonArr.add(jsonObj); // 添加"第一个子元素"
jsonArr.add(childJson); // 添加当前子元素
} else if (o instanceof JSONArray) { // 如果已经存在JSONArray,则直接在该JSONArray中添加
jsonArr = (JSONArray) o;
jsonArr.add(childJson); // 添加当前子元素
}
json.put(e.getName(), jsonArr); // {e:[{child1},{child2},{child3}]}
}
}
}
}
public static boolean isEmpty(String str) {
if (str == null || str.trim().isEmpty() || "null".equals(str)) {
return true;
}
return false;
}
}
dom4j 和 fastjson
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
jsonObj的内容:
{
"customer": {
"books": {
"book": [
{
"price": "100.0",
"name": "三国演义",
"id": "1"
},
{
"name": "红楼梦",
"id": "2"
},
{
"price": "100.0",
"id": "1"
},
{
"price": "50.0",
"name": "西游记"
}
]
},
"name": "lanying",
"id": "100",
"age": "29"
}
}
【xml转换成json】https://www.cnblogs.com/liushisaonian/p/8657555.html
【Dom4j中getStringValue()和getText()用法和区别】https://blog.csdn.net/www_wangjun/article/details/71404204
【fastjson中toString与toJSONString的差别】https://www.cnblogs.com/zouhong/p/12091493.html
【xml <=> json在线转换工具】https://www.bejson.com/xml2json/
【JSONobject按照put顺序存储和读取】https://blog.csdn.net/dushu990/article/details/80670088