一、由xml格式数据转成json,遍历json对象 ,并返回map的一套完整流程,可根据自己需求改变。返回map可定义全局变量
测试mian方法:
public static void main(String[] args) throws JDOMException, IOException {
//xml格式字符串
String xml="<?xml version=\"1.0\" encoding=\"UTF-8\" ?><root><TcpCont><MvnoID>SJHL01</MvnoID><InterfaceCode>Svc_ProvisionRet</InterfaceCode><MessageID>SJHL01201808090058195645</MessageID><RspTime>20180809005825</RspTime><RspCode>002</RspCode><Token>66905acba6fb790bf6fe9ef2582636c6581810f9439e14d6963217f802785913</Token></TcpCont><SvcRetCont><BusiRet><RetCode>0000</RetCode><RetDesc>处理成功</RetDesc><DoneCode>2000000022012604</DoneCode></BusiRet></SvcRetCont></root>";
//转成json对象
JSONObject jsonobject=xml2JSON(xml.replace("UTF-8","utf-8").getBytes());
System.out.println(jsonobject);
Map mapjson=JsonOps.json2Map(jsonobject.toJSONString());
System.out.println(mapjson);
json转成map
JsonMap(jsonobject);
}
//解析json遍历
public static void JsonMap(JSONObject jsonobject) {
Set<String> keySet = jsonobject.keySet();
Map<Object, Object> map = new HashMap<Object, Object>(keySet.size());
System.out.println("key++"+keySet);
for (String key : keySet) {
map.put(key, jsonobject.get(key));
JSONObject j = (JSONObject) JSON.toJSON(map);
Object json = JSON.toJSON(j.get(key));
System.out.println(key+"===="+json);
//判断遍历出来的是数组还是啥
if (json instanceof JSONArray) {
System.out.println("是json数组");
jsonArrayToMap((JSONArray) json);
} else if (json instanceof JSONObject) {
System.out.println("是JSONObject");
JSONObject object = (JSONObject) JSON.toJSON(json);
递归处理对象 是对象继续遍历 直到遍历出数组
JsonMap(object);
} else {
System.out.println("是map");
// 不是json数组则为key添加值
//其实我感觉可以不用这一步
}
}
}
是数组 做特殊处理 有用json对象值是以数组方式存在 所以最后都是返回数组
public static void jsonArrayToMap(JSONArray jsonArray) {
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = (JSONObject) jsonArray.get(i);
// 继续遍历
for (String key : jsonObject.keySet()) {
// Element addElement = childrenElement.addElement(key);
Object arry = JSON.toJSON(jsonObject.get(key));
if (arry instanceof JSONArray) {
// 递归
//这里为什么要try呢因为对象里数组和 值都是数组 这边用于判断是否继续遍历 值是数组是不需要遍历的
try {
JSONArray jsonObject2 = (JSONArray) arry;
jsonArrayToMap((JSONArray) arry);
} catch (Exception e) {
System.out.println(key+"=="+arry);
//这里是最后的答案 可以已开始放入map集合了 这里我就没有放入了,
}
} else {
System.out.println(key+"="+arry);
}
}
}
}
/**
* xml转换成json
*/
public static JSONObject xml2JSON(byte[] xml) throws JDOMException, IOException {
JSONObject json = new JSONObject();
InputStream is = new ByteArrayInputStream(xml);
SAXBuilder sb = new SAXBuilder();
org.jdom2.Document doc = sb.build(is);
Element root = doc.getRootElement();
json.put(root.getName(), iterateElement(root));
return json;
}
private static JSONObject iterateElement(Element element) {
List node = element.getChildren();
Element et = null;
JSONObject obj = new JSONObject();
List list = null;
for (int i = 0; i < node.size(); i++) {
list = new LinkedList();
et = (Element) node.get(i);
if (et.getTextTrim().equals("")) {
if (et.getChildren().size() == 0)
continue;
if (obj.containsKey(et.getName())) {
list = (List) obj.get(et.getName());
}
list.add(iterateElement(et));
obj.put(et.getName(), list);
} else {
if (obj.containsKey(et.getName())) {
list = (List) obj.get(et.getName());
}
list.add(et.getTextTrim());
obj.put(et.getName(), list);
}
}
return obj;
}