package com.best.javaSdk; import com.best.javaSdk.converter.Converter; import com.best.javaSdk.converter.impl.*; import com.best.javaSdk.converter.util.jsonReader.*; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.StringReader; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.*; public class Parser { private static Map converterMap; static { converterMap = new HashMap<>(); converterMap.put(String.class, new StringConverter()); converterMap.put(int.class, new IntConverter()); converterMap.put(Integer.class, new IntConverter()); converterMap.put(float.class, new FloatConverter()); converterMap.put(Float.class, new FloatConverter()); converterMap.put(double.class, new DoubleConverter()); converterMap.put(Double.class, new DoubleConverter()); converterMap.put(long.class, new LongConverter()); converterMap.put(Long.class, new LongConverter()); converterMap.put(boolean.class, new BooleanConverter()); converterMap.put(Boolean.class, new BooleanConverter()); converterMap.put(Date.class, new DateConverter()); } public static String coverObject2Xml(Object o) { StringBuilder sb = new StringBuilder(""); Class cls = o.getClass(); String className = cls.getName(); className = className.substring(className.lastIndexOf(".") + 1); if (className.endsWith("Req")) { sb.append(appendXmlNode("request", object2XmlConvert(o))); } else { sb.append(appendXmlNode("response", object2XmlConvert(o))); } return sb.toString(); } public static String object2XmlConvert(Object o) { StringBuilder stringBuilder = new StringBuilder(); try { Class cls = o.getClass(); if (cls.getName().startsWith("java.lang")) { return o.toString(); } Field[] props = cls.getDeclaredFields(); for (Field prop : props) { prop.setAccessible(true); String propName = prop.getName(); Class propType = prop.getType(); Object propValue = prop.get(o); StringBuilder stb = new StringBuilder(); if(propValue == null) { continue; } if(converterMap.containsKey(propType)) { stb = new StringBuilder(converterMap.get(propType).xmlReverse(propValue, prop)); } else if (propType.getName().equals("java.util.List")) { List valueList = (List) propValue; for (Object value : valueList) { stb.append(appendXmlNode(propName, object2XmlConvert(value))); } } else { stb = new StringBuilder(appendXmlNode(propName, object2XmlConvert(propValue))); } stringBuilder.append(stb); } } catch (Exception e) { return "parser error : " + e.getMessage(); } return stringBuilder.toString(); } public static String appendXmlNode(String nodeName, String nodeValue) { StringBuilder sb = new StringBuilder(); return sb.append("<").append(nodeName).append(">").append(nodeValue).append("").toString(); } public static T coverXml2Object(String xml, Class clazz) { if(xml == null || "".equals(xml)) { return null; } try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new InputSource(new StringReader(xml))); Element root = doc.getDocumentElement(); NodeList nodeList = root.getChildNodes(); return handelNodes(nodeList, clazz); } catch (Exception e) { e.printStackTrace(); } return null; } public static T handelNodes(NodeList nodeList, Class clazz) { try { if (nodeList == null) { return null; } if (clazz.getName().startsWith("java.lang")) { return (T)nodeList.item(0).getNodeValue(); } T obj = clazz.newInstance(); Map> listChildMap = new HashMap<>(); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); String nodeName = node.getNodeName(); short nodeType = node.getNodeType(); if (nodeType == 3 || nodeType == 4) { continue; } if(!node.hasChildNodes()) { continue; } Field[] fields = clazz.getDeclaredFields(); if(!isContainProp(fields, nodeName)) { continue; } Field field = clazz.getDeclaredField(nodeName); field.setAccessible(true); Class fieldType = field.getType(); if (fieldType.getName().equals("java.util.List")) { Type type = field.getGenericType(); if(type instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) type; Class genericClazz = (Class) pt.getActualTypeArguments()[0]; Object listChildObj = handelNodes(node.getChildNodes(), genericClazz); if (listChildMap.get(field) == null) { List objectList = new ArrayList<>(); objectList.add(listChildObj); listChildMap.put(field, objectList); } else { listChildMap.get(field).add(listChildObj); } } } else { Converter converter = converterMap.get(fieldType); if (converter == null) { field.set(obj, handelNodes(node.getChildNodes(), fieldType)); continue; } Object convert = converter.convertXml(node, field); if (convert != null) { field.set(obj, convert); } } } for (Field field : listChildMap.keySet()) { field.set(obj, listChildMap.get(field)); } return obj; } catch (InstantiationException | IllegalAccessException | NoSuchFieldException e) { e.printStackTrace(); } return null; } public static T convertJson2Object(String str, Class clazz) { try { JSONReader reader = new JSONValidatingReader(new ExceptionErrorListener()); Object rootObj = reader.read(str); return convertJson2Object(rootObj, clazz); }catch (Exception e) { e.printStackTrace(); } return null; } private static T convertJson2Object(Object object, Class clazz) throws Exception { T t = clazz.newInstance(); if (object instanceof Map) { Map rootJson = (Map) object; for (Object obj : rootJson.keySet()) { String itemName = obj.toString(); Object itemValue = rootJson.get(obj); Field[] fields = clazz.getDeclaredFields(); if (!isContainProp(fields, itemName)) { continue; } Field field = clazz.getDeclaredField(itemName); field.setAccessible(true); Class fieldType = field.getType(); Object value; Converter converter = converterMap.get(fieldType); if (converter == null && itemValue instanceof Map) { value = convertJson2Object(itemValue, fieldType); } else if (itemValue instanceof ArrayList && fieldType.equals(List.class)) { value = handlerListJson((ArrayList) itemValue, field); } else if (converter != null) { if (itemValue == null) { value = null; } else { value = converter.convertJson(itemValue, field); } } else { continue; } if (value != null) { field.set(t, value); } } } return t; } private static List handlerListJson(ArrayList value, Field field) throws Exception { List list = new ArrayList<>(); Type type = field.getGenericType(); if(type instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) type; Class genericClazz = (Class) pt.getActualTypeArguments()[0]; Converter converter = converterMap.get(genericClazz); for (Object object : value) { if (object instanceof Map) { list.add(convertJson2Object(object, genericClazz)); }else { list.add(converter.convertJson(object, field)); } } } return list; } public static String convertObject2Json(Object object) { try { JSONWriter jsonWriter = new JSONWriter(); return jsonWriter.write(object); } catch (Exception e) { e.printStackTrace(); } return null; } private static boolean isContainProp(Field[] fields, String nodeName) { if(fields == null || fields.length < 0) { return false; } if(nodeName == null || "".equals(nodeName)) { return false; } for(Field field : fields) { if(field.getName().equals(nodeName)) { return true; } } return false; } }