整理了以下兩個實現形式:
方式一:
- 把maven包引用好
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.7</version>
</dependency>
public static String toXml(String json){
String xml = JSONUtil.toXmlStr( JSONUtil.parse(json));
StringBuilder sb = new StringBuilder();
sb.append("<root>");
sb.append(xml);
sb.append("</root>");
return sb.toString();
}
public static String toJson(String xml){
return JSONUtil.parseFromXml(xml).toString();
}
方式二:
- 把maven包引用好
<!-- https://mvnrepository.com/artifact/org.jdom/jdom2 -->
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom2</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
XmlAndJson.java
import net.sf.json.JSONArray;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.XMLOutputter;
import net.sf.json.JSONObject;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class XmlAndJson {
private static Map<String, Object> getAttributes(Element element) {
Map<String, Object> result = new HashMap<>();
List<Attribute> attrList = element.getAttributes();
for (Attribute attr : attrList) {
result.put(attr.getName(), attr.getValue());
}
return result;
}
private static Map<String, Object> iterateElement(Element element) {
Map<String, Object> result = new HashMap<>();
if (!element.getText().isEmpty() || !"".equals(element.getText().intern())) {
result.put(element.getName(), element.getValue());
return result;
}
List<Attribute> attrList = element.getAttributes();
for (Attribute attr : attrList) {
result.put(attr.getName(), attr.getValue());
}
//如果子集不爲空,則迭代
List<Element> children = element.getChildren();
if (!children.isEmpty()) {
Map<String, List<Map<String, Object>>> temp = new HashMap<>();
for (Element child : children) {
if (element.getChildren(child.getName()).size() > 1) {
List<Map<String, Object>> te = temp.get(child.getName());
Map<String, Object> childMap = new HashMap<>();
childMap.put(child.getName(), iterateElement(child));
if (te != null && !te.isEmpty()) {
te.add(childMap);
} else {
te = new ArrayList<>();
te.add(childMap);
temp.put(child.getName(), te);
}
} else {
if (child.getChildren().isEmpty()) {
if (!child.getAttributes().isEmpty()) {
List<Attribute> cattrList = child.getAttributes();
Map<String, Object> childMap = new HashMap<>();
for (Attribute attr : cattrList) {
childMap.put(attr.getName(), attr.getValue());
}
result.put(child.getName(), childMap);
} else {
result.put(child.getName(), child.getValue());
}
} else {
result.put(child.getName(), iterateElement(child));
}
}
}
for (String key : temp.keySet()) {
List<Map<String, Object>> cList = new ArrayList<>();
for (Map<String, Object> obj : temp.get(key)) {
cList.add((Map<String, Object>) obj.get(key));
}
result.put(key, cList);
}
}
return result;
}
/**
* 轉換一個xml格式的字符串到json格式
*
* @param xml xml格式的字符串
* @return 成功返回json 格式的字符串;失敗反回null
*/
public static String xmlToJson(String xml) {
JSONObject obj = new JSONObject();
try {
InputStream is = new ByteArrayInputStream(xml.getBytes("utf-8"));
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(is);
Element root = doc.getRootElement();
obj.put(root.getName(), iterateElement(root));
} catch (Exception e) {
e.printStackTrace();
}
return obj.toString();
}
/**
* 轉換一個json格式的字符串到xml格式
*
* @param jsonstr json格式的字符串
* @return 成功返回xml 格式的字符串;失敗反回null
*/
public static String jsonToXml(String jsonstr) {
if (jsonstr == null) {
return null;
} else {
JSONObject json = JSONObject.fromObject(jsonstr);
Element elements = new Element("root");
getXMLFromObject(json, "root", elements);
XMLOutputter xmlOut = new XMLOutputter();
return xmlOut.outputString(elements);
}
}
private static void getXMLFromObject(Object obj, String tag, Element parent) {
if (obj == null) {
return;
}
Element child;
String eleStr;
Object childValue;
if (obj instanceof JSONObject) {
JSONObject jsonObject = (JSONObject) obj;
for (Object temp : jsonObject.keySet()) {
eleStr = temp.toString();
childValue = jsonObject.get(temp);
child = new Element(eleStr);
if (childValue instanceof JSONArray) {
getXMLFromObject(childValue, eleStr, parent);
} else {
parent.addContent(child);
getXMLFromObject(childValue, eleStr, child);
}
}
} else if (obj instanceof JSONArray) {
JSONArray jsonArray = (JSONArray) obj;
for (int i = 0; i < jsonArray.size(); i++) {
childValue = jsonArray.get(i);
child = new Element(tag);
parent.addContent(child);
getXMLFromObject(childValue, tag, child);
}
} else if (obj instanceof Date) {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
parent.setText(sf.format((Date) obj));
} else {
parent.setText(obj.toString());
}
}
}
調用示例
String orgjson = "{\n" +
" \"明細\":[\n" +
" { \n" +
" \"編號\":\"01030021\",\n" +
" \"名稱\":\"CPU\" \n" +
" },\n" +
" {\n" +
" \n" +
" \"編號\":\"01030022\",\n" +
" \"名稱\":\"工作站\" \n" +
" }\n" +
" ]\n" +
"}";
System.out.println("#####################原始json串#####################");
System.out.println(orgjson);
System.out.println("#####################方法一#####################");
System.out.println("##################### json => xml #####################");
//方法1
String xml = toXml(orgjson);
System.out.println(xml);
System.out.println("##################### xml => json#####################");
//to json 方法1
String json = toJson(xml);
System.out.println(json);
System.out.println("#####################方法二#####################");
//方法2
System.out.println("##################### json => xml #####################");
String xml2 = XmlAndJson.jsonToXml(orgjson);
System.out.println(xml2);
System.out.println("##################### xml => json#####################");
String json2 = toJson(xml2);
System.out.println(json2);
文檔: