##根据xml模板生成xml

##根据xml模板生成xml

package com.hanxu.utils.direct;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hanxu.exception.BusinessException;
import org.apache.commons.lang.StringUtils;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.StringTokenizer;

/**
 * xml模板解析
 * @author hanxu
 * @date 2021年03月26日 17:16
 */
public class XMLTempParseFactory {

    private final static String DATA_KEY = "data";
    private final static String IF_NODE_NAME = "x-if";
    private final static String IF_NODE_ATTRIBUTE = "data";
    private final static String SWITCH_NODE_NAME = "x-switch";
    private final static String SWITCH_NODE_ATTRIBUTE = "data";
    private final static String CASE_NODE_NAME = "x-case";
    private final static String CASE_NODE_DATA = "data";
    private final static String DEFAULT_NODE_NAME = "x-default";
    private final static String LIST_NODE_NAME = "x-list";
    private final static String LIST_NODE_ATTRIBUTE = "data";
    private final static String DATA_NODE_NAME = "x-data";
    private final static String DATA_NODE_ATTRIBUTE = "data";
    private static JSONObject dataJson = new JSONObject();


    // 单例
    private static XMLTempParseFactory xmlTempParseFactory = null;

    private XMLTempParseFactory(){
    }

    public static synchronized XMLTempParseFactory getXMLTempParseFactory(){
        if (xmlTempParseFactory == null){
                xmlTempParseFactory = new XMLTempParseFactory();
        }
        return xmlTempParseFactory;
    }

    /**
     * 解析xml模板,生成xml文件字符串
     * @param xmlTemp
     * @param json
     * @return
     * @throws Exception
     */
    public synchronized String parseXmlTemp(String xmlTemp, String json) throws Exception{

        //1.创建SAXBuilder对象
        SAXBuilder saxBuilder = new SAXBuilder();
        String encoding = this.getEncoding(xmlTemp);

        //3.将输入流加载到build中
        xmlTemp = xmlTemp.trim().replaceAll("[\\n\u200B-\u200D\uFEFF]", "");// \\n:换行;\\u200B-\\u200D\\uFEFF: 0宽度空格
        // xmlTemp = StringUtils.remove(xmlTemp, '\uFEFF'); // 去除零宽度空格(ZWSP)
        // xmlTemp = StringUtils.remove(xmlTemp, '\u200B'); // 去除零宽度空格(ZWSP)
        Document document = saxBuilder.build(new ByteArrayInputStream(xmlTemp.getBytes(encoding)));
        //4.获取根节点
        Element rootElement = document.getRootElement();

        dataJson = JSONObject.parseObject(new String(json.getBytes(encoding), encoding));
        this.parseNode(rootElement, dataJson, DATA_KEY);


        // 设置xml格式化的属性
        Format format = Format.getRawFormat();
        format.setIndent("  "); // 文本缩进
        format.setTextMode(Format.TextMode.TRIM_FULL_WHITE);
        format.setEncoding(encoding);

        // 创建xml输出流操作类
        XMLOutputter xmlOutput = new XMLOutputter(format);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PrintWriter out = new PrintWriter(baos);
        try {
            xmlOutput.output(document, out);
            return baos.toString();
        }catch (Exception ex){
            throw ex;
        }finally {
            baos.close();
        }
    }

    /**
     * 解析节点数据
     * @param element   :读取节点
     * @param json      :节点数据
     */
    private void parseNode(Element element, JSONObject json, String firstKey){
        String nodeName = element.getName();
        if (StringUtils.isBlank(nodeName)){
            return;
        }
        // 解析节点动态属性
        this.parseElementAttribute(element, json, firstKey);

        if (nodeName.startsWith(IF_NODE_NAME)){
            // 拼接if标签
            this.parseIf(element, json, firstKey);
        }else if(nodeName.startsWith(SWITCH_NODE_NAME)){
            // switch
            this.parseSwtich(element, json, firstKey);
        }else if(nodeName.startsWith(LIST_NODE_NAME)){
            // 拼接list标签
            this.parseList(element, json);
        }else if(nodeName.startsWith(DATA_NODE_NAME)){
            // 动态名称表单
            this.parseData(element, json, firstKey);
        }else {
            List<Content> list = element.getContent();
            if (list != null && list.size() > 0){
                for (int i = 0; i < list.size(); i++){
                    Content content = list.get(i);
                    if (content instanceof Text){
                        String value = content.getValue();
                        if (StringUtils.isNotBlank(value) && value.trim().startsWith("${")){
                            Object text = this.getJsonValue(json, value, firstKey);
                            ((Text) content).setText(this.objectToString(text));
                        }
                    }else if(content instanceof Element){
                        this.parseNode((Element)content, json, firstKey);
                    }
                }
            }
        }
    }

    /**
     * 解析节点的属性值
     */
    private void parseElementAttribute(Element element, JSONObject json, String firstKey){
        List<Attribute> attributeList = element.getAttributes();
        if (attributeList != null && attributeList.size() > 0){
            for (Attribute attribute : attributeList){
                if (Objects.equals("data", attribute.getName())){
                    continue;
                }
                String value = attribute.getValue();
                if (this.isReplaceString(value)){
                    Object obj = this.getJsonValue(json, value, firstKey);
                    attribute.setValue(String.valueOf(obj));
                }
            }
        }
    }

    /**
     * switch解析
     */
    private void parseSwtich(Element element, JSONObject json, String firstKey) {
        Attribute caseAttribute = element.getAttribute(SWITCH_NODE_ATTRIBUTE);
        if (caseAttribute == null){
            throw new BusinessException(SWITCH_NODE_NAME + "中【" + SWITCH_NODE_ATTRIBUTE + "】不能为空!");
        }
        String valueStr = caseAttribute.getValue();
        Object valueObj = this.getJsonValue(json, valueStr, firstKey);

        // case列表
        List<Content> caseList = element.getContent();
        if (caseList == null || caseList.size() == 0){
            throw new BusinessException(SWITCH_NODE_NAME + "中case列表不能为空不能为空!");
        }
        // 当前switch得父级几点
        Element parentElement = element.getParentElement();
        parentElement.removeContent(element); // 删除当前switch标签

        Element defaultElement = null;
        for (Content content : caseList){
            if (content instanceof Element){
                Element caseItem = (Element) content.clone();
                if (Objects.equals(caseItem.getName(), CASE_NODE_NAME)){
                    Attribute caseDataAttribute = caseItem.getAttribute(CASE_NODE_DATA);
                    if (caseDataAttribute == null){
                        throw new BusinessException(CASE_NODE_NAME + "中【" + CASE_NODE_DATA + "】不能为空!");
                    }
                    String dataStr = caseDataAttribute.getValue();
                    if (this.isReplaceString(dataStr)){// 如果case是表达是,将case解析
                        Object obj = this.getJsonValue(json, dataStr, firstKey);
                        dataStr = obj == null ? "" : obj.toString();
                    }
                    if (Objects.equals(dataStr, String.valueOf(valueObj))){// case判断通过,执行case
                        List<Content> caseContenList = caseItem.getContent();
                        if (caseContenList != null){
                            for (Content caseContentItem : caseContenList){
                                Content contentItem = (Content) caseContentItem.clone();
                                if(contentItem instanceof Element){
                                    parentElement.addContent(contentItem);// 设置case节点的父级节点
                                    this.parseNode((Element) contentItem, json, firstKey);
                                }else {
                                    parentElement.addContent(contentItem);
                                }
                            }
                        }
                        return;
                    }
                }else if (Objects.equals(caseItem.getName(), DEFAULT_NODE_NAME)){
                    defaultElement = caseItem;
                }
            }
        }

        if (defaultElement != null){
            List<Content> defaultConentList = defaultElement.getContent();
            if (defaultConentList != null){
                for (Content defaultContent : defaultConentList){
                    Content defaultElementClone = (Content) defaultContent.clone();
                    if(defaultContent instanceof Element){
                        parentElement.addContent(defaultElementClone);// 设置default节点的父级节点
                        this.parseNode((Element) defaultElementClone, json, firstKey);
                    }else {
                        parentElement.addContent(defaultElementClone);
                    }
                }
            }
        }

    }

    /**
     * 拼接动态数据标签
     */
    private void parseData(Element element, JSONObject json, String firstKey) {
        Attribute testAttribute = element.getAttribute(DATA_NODE_ATTRIBUTE);
        if (testAttribute == null){
            throw new BusinessException(DATA_NODE_NAME + "中【" + DATA_NODE_ATTRIBUTE + "】不能为空!");
        }
        String attributeValue = testAttribute.getValue();
        Object value = this.getJsonValue(json, attributeValue, firstKey);

        element.setName(String.valueOf(value));
        element.removeAttribute(DATA_NODE_ATTRIBUTE);
        // 继续解析节点
        this.parseNode(element, json, firstKey);

    }

    /**
     * 解析if标签
     */
    private void parseIf(Element element, JSONObject json, String firstKey){
        Attribute testAttribute = element.getAttribute(IF_NODE_ATTRIBUTE);
        if (testAttribute == null){
            throw new BusinessException(IF_NODE_NAME + "中【" + IF_NODE_ATTRIBUTE + "】不能为空!");
        }
        String attributeValue = testAttribute.getValue();
        Element parentElement = element.getParentElement();
        parentElement.removeContent(element); // 删除当前if标签,下面会解析标签内容,并添加到当前if的父标签中

        if (testBoolean(attributeValue, json, firstKey)){
            List<Content> ifElement = element.getContent();
            if (ifElement != null && ifElement.size() > 0){
                if (ifElement.size() == 1){
                    Content content = ifElement.get(0);
                    if (content instanceof Element){
                        Element newElement = (Element) content.clone();
                        parentElement.addContent(0, newElement);
                        // 递归元素内容
                        this.parseNode(newElement, json, firstKey);
                    }else if (content instanceof Text){
                        if (parentElement.getContentSize() == 1){
                            String value = ((Text) content).getText();
                            if (this.isReplaceString(value)){
                                Object text = this.getJsonValue(json, value, firstKey);
                                parentElement.setText(this.objectToString(text));
                            }else {
                                parentElement.setContent((Content)content.clone());
                            }
                        }else {
                            throw new BusinessException("<x-if " + IF_NODE_ATTRIBUTE + "=\"" + attributeValue + "\">内需要增加标签内容。");
                        }
                    }
                }else {
                    for (Content ele : ifElement){
                        if (ele instanceof Element){
                            Element newElement = (Element) ele.clone();
                            parentElement.addContent(0, newElement);
                            // 递归元素内容
                            this.parseNode(newElement, json, firstKey);
                        }else if(ele instanceof Text){
                            Content newElement = (Content) ele.clone();
                            parentElement.addContent(0, newElement);
                        }
                    }
                }
            }
        }else {
            // 删除当前元素
            parentElement.removeContent(element);
        }
    }

    /**
     * 解析list标签
     */
    private void parseList(Element element, JSONObject json){
        Attribute listAttribute = element.getAttribute(LIST_NODE_ATTRIBUTE);
        if (listAttribute == null){
            throw new BusinessException(LIST_NODE_NAME + "中【" + LIST_NODE_ATTRIBUTE + "】不能为空!");
        }

        String listStr = listAttribute.getValue();  // item as data.list
        String[] listAry = listStr.split("as");
        if (listAry == null || listAry.length != 2){
            throw new BusinessException("循环属性设置不正确:" + listStr);
        }
        String itemKeyName = listAry[0].trim(); // 循环子元素名称
        if (Objects.equals(itemKeyName, DATA_KEY)){
            throw new BusinessException("循环子元素不能命名为:" + DATA_KEY + ", [" + listStr + "]");
        }
        // list的父级
        Element parent = element.getParentElement();
        // 循环体内容
        List<Content> itemList = element.getContent();
        // 删除List标签,下面会解析标签内容,并拼接到parent中
        parent.removeContent(element);

        // 循环数据
        JSONArray listArray = (JSONArray) getJsonValue(json, listAry[1].trim(), DATA_KEY);
        if (listArray != null && listArray.size() > 0){
            // 循环数据
            Iterator iterator = listArray.iterator();
            while (iterator.hasNext()){
                Object itemData = iterator.next();
                if (!(itemData instanceof JSONObject)){
                    throw new BusinessException("list子元素需要为json对象");
                }
                JSONObject itemJson = (JSONObject) itemData;

                // list中的item
                for (int i = 0; i < itemList.size(); i++){
                    Content newContent = (Content)itemList.get(i).clone();

                    if (newContent instanceof Text){ // 节点为文本
                        String text = ((Text) newContent).getText();
                        if (this.isReplaceString(text)){// 如果为需要替换的字符串
                            Object itemValue = this.getJsonValue(itemJson, text, itemKeyName);
                            parent.addContent(0, new Element(this.objectToString(itemValue)));
                        }else {
                            parent.addContent(0, newContent);
                        }
                    }else if (newContent instanceof Element){   // 节点为对象
                        parent.addContent(newContent);
                        this.parseNode((Element) newContent, itemJson, itemKeyName);
                    }
                }
            }
        }
    }

    /**
     * 获得if判断条件,返回的boolean值
     */
    private boolean testBoolean(String test, JSONObject json, String firstKey){
        try {
            String[] testArray = test.split(" |!|!=|==|>=|<=|<|>|&|\\|");

            for (String item : testArray){
                if (StringUtils.isNotBlank(item) && item.trim().contains(".")){
                    String replaceItem = item.trim();
                    Object replaceValue = getJsonValue(json, replaceItem, firstKey);
                    if (replaceValue instanceof Integer || replaceValue instanceof Double){
                        test = test.replace(replaceItem, String.valueOf(replaceValue));
                    }else if(replaceValue == null){
                        test = test.replace(replaceItem, "\"\"");
                    }else {
                        test = test.replace(replaceItem, String.valueOf("\"" + replaceValue + "\""));
                    }
                }
            }

            Boolean boo = Boolean.valueOf(ParseUtils.engine.eval(test).toString());

            //  System.out.println("(" + test + ") ==== " + boo);
            return boo;
        }catch (Exception ex){
            ex.printStackTrace();
            throw new BusinessException("解析if表达式失败:" + test + "|" + ex.toString());
        }
    }


    /**
     * 从json对象中取值,不存在返回空字符串
     * @param json  :取值对象(在list循环过程中取list数据中的子数据)
     * @param keyStr   :data.data
     * @return
     */
    private Object getJsonValue(JSONObject json, String keyStr, String firstKey){
        if (StringUtils.isBlank(keyStr)){
            return "";
        }
        keyStr = keyStr.trim().replace("${", "").replace("}", "");
        String[] keyArray = keyStr.split("\\.");
        String key = keyArray[0];
        if (!Objects.equals(DATA_KEY, key) && StringUtils.isNotBlank(firstKey) && !Objects.equals(firstKey, key)){
            throw new BusinessException("参数表达式不正确:" + keyStr);
        }
        // 如果是data.从全局取参数,如果是其他,从当前json中取
        JSONObject jsonValue = Objects.equals(key, DATA_KEY) ? dataJson : json;

        return ParseUtils.getJsonValue(jsonValue, keyStr);
    }

    /**
     * 判断是否为需要替换的字符串
     */
    private boolean isReplaceString(String text){
        if (StringUtils.isNotBlank(text) && text.trim().startsWith("${") && text.trim().endsWith("}")){
            return true;
        }
        return false;
    }

    /**
     * 转string
     */
    private String objectToString(Object obj) {
        if (obj == null){
            return null;
        }
        try {
            // return new String(obj.toString().getBytes("GBK"), "UTF-8");
        }catch (Exception ex){
            ex.printStackTrace();
        }
        return obj.toString();
    }

    /**
     * 获得xml编码格式
     */
    private String getEncoding(String xml){
        if (xml.startsWith("<?xml")) {
            int end = xml.indexOf("?>");
            String sub = xml.substring(0, end);
            StringTokenizer tokens = new StringTokenizer(sub, " =\"'");
            while (tokens.hasMoreTokens()) {
                String token = tokens.nextToken();
                if ("encoding".equals(token)) {
                    if (!(tokens.hasMoreTokens()))
                        break;
                    return tokens.nextToken();
                }
            }
        }

        return "UTF-8";
    }

    public static void main(String[] args) {

        String xmlStr = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
                " <web>" +
                "    <data1>" +
                "        <x-if data=\"data.code == 'XY202103240002'\">" +
                "     <have>${data.code}</have>" +
                "        </x-if>" +
                "        <have>notif</have>" +
                "    </data1>" +
                "    <data2>" +
                "<x-list data=\"item as data.childBankList\">" +
                "    <list>${item.accountNumber}</list>" +
                "    <x-if data=\"1 == 1\">" +
                "                <if>${item.type}</if>" +
                "            </x-if>" +
                "        </x-list>" +
                "    </data2>" +
                "    <data3>" +
                "        <x-data data=\"data.code\">${data.parentCompany}</x-data>" +
                "    </data3>" +
                "</web>";

        String json = "{\"code\":\"XY202103240002\",\"execEndType\":\"\",\"execCount\":\"3\",\"execTime\":\"14:00\",\"excelUrl\":\"\",\"nowRecordVersion\":\"1\",\"parentAccount\":\"77120122000016235\",\"type\":\"1\",\"triggerMoney\":\"\",\"execEndTime\":\"\",\"parentBranch\":\"宁波银行股份有限公司北京海淀科技支行\",\"validRecordVersion\":\"1\",\"execDay\":\"\",\"parentBankId\":\"319\",\"recordVersion\":\"1\",\"childBankList\":[{\"code\":\"\",\"lastModifyBy\":\"3991\",\"isDelete\":0,\"accountType\":\"一般户\",\"bankBranchName\":\"宁波银行股份有限公司北京海淀科技支行\",\"companyName\":\"天津车之家数据信息技术有限公司\",\"accountNumber\":\"77120122000016388\",\"type\":\"CHILD\",\"version\":1,\"recordId\":\"103\",\"bankId\":\"320\",\"createBy\":\"3991\",\"recordVersion\":\"1\",\"createTime\":\"2021-03-24 13:56:12\",\"lastModifyTime\":\"2021-03-24 13:56:12\",\"currency\":\"CNY\",\"id\":\"267\"},{\"code\":\"\",\"lastModifyBy\":\"3991\",\"isDelete\":0,\"accountType\":\"一般户\",\"bankBranchName\":\"宁波银行股份有限公司北京海淀科技支行\",\"companyName\":\"浙江车智广告有限公司\",\"accountNumber\":\"77120122000016500\",\"type\":\"CHILD\",\"version\":1,\"recordId\":\"103\",\"bankId\":\"321\",\"createBy\":\"3991\",\"recordVersion\":\"1\",\"createTime\":\"2021-03-24 13:56:12\",\"lastModifyTime\":\"2021-03-24 13:56:12\",\"currency\":\"CNY\",\"id\":\"268\"}],\"processId\":\"270830\",\"percentage\":\"\",\"id\":\"103\",\"execType\":\"2\",\"approveState\":\"4\",\"parentAccountType\":\"一般户\",\"cron\":\"0 0 14 * * ?\",\"parentCurrency\":\"CNY\",\"nowRecordId\":\"103\",\"createByName\":\"刘德凯\",\"lastModifyBy\":\"3991\",\"parentBank\":{\"code\":\"\",\"lastModifyBy\":\"3991\",\"isDelete\":0,\"accountType\":\"一般户\",\"bankBranchName\":\"宁波银行股份有限公司北京海淀科技支行\",\"companyName\":\"车智互通(北京)广告有限公司\",\"accountNumber\":\"77120122000016235\",\"type\":\"PARENT\",\"version\":2,\"recordId\":\"103\",\"bankId\":\"319\",\"createBy\":\"3991\",\"recordVersion\":\"1\",\"createTime\":\"2021-03-24 13:56:12\",\"lastModifyTime\":\"2021-03-24 13:56:12\",\"currency\":\"CNY\",\"id\":\"266\"},\"jobCenterId\":\"348\",\"isDelete\":0,\"reserveMoney\":\"\",\"validRecordId\":\"103\",\"priority\":\"\",\"hasApprovePermission\":false,\"lastModifyByName\":\"刘德凯\",\"version\":\"\",\"execCycle\":\"day\",\"parentCompany\":\"车智互通(北京)广告有限公司\",\"createBy\":\"3991\",\"money\":\"110000\",\"createTime\":\"2021-03-24 13:56:12\",\"lastModifyTime\":\"2021-03-24 14:38:13\",\"flowTypeCode\":\"CECASHPOOLV2\",\"name\":\"测试上划-不足不转\",\"formNo\":\"XY202103240002_1_0\",\"hasExecCount\":\"2\",\"intUnit\":\"\",\"status\":\"1\"}";

        XMLTempParseFactory readXml = new XMLTempParseFactory();
        String xml = null;
        try {
            xml = readXml.parseXmlTemp(xmlStr, json);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(xml);
    }

}

package com.hanxu.utils.direct;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hanxu.common.DateHelper;
import com.hanxu.dto.direct.DirectResponseData;
import com.hanxu.exception.BusinessException;
import com.hanxu.model.direct.TabBankDirectInterfaceTemp;
import org.apache.commons.lang.StringUtils;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author hanxu
 * @date 2021年04月09日 10:09
 */
public class ParseUtils {


    // 表单式解析引擎
    public static ScriptEngine engine = null;

    static {
        ScriptEngineManager manager = new ScriptEngineManager();
        engine = manager.getEngineByName("js");
    }


    /**
     * 解析判断表达式
     */
    public static boolean parseEstimateExpression(JSONObject json, String expression) throws Exception{
        expression = expression.replace("${", "").replace("}", "");
        String[] expressionArray = expression.split(" |!|!=|==|>=|<=|<|>|&|\\|");

        for (String item : expressionArray){
            if (StringUtils.isNotBlank(item) && item.trim().contains(".")){
                String replaceItem = item.trim();
                Object replaceValue = getJsonValue(json, replaceItem);
                if (replaceValue instanceof Integer || replaceValue instanceof Double){
                    expression = expression.replace(replaceItem, String.valueOf(replaceValue));
                }else if(replaceValue == null){
                    expression = expression.replace(replaceItem, "\"\"");
                }else {
                    expression = expression.replace(replaceItem, String.valueOf("\"" + replaceValue + "\""));
                }
            }
        }

        return Boolean.valueOf(engine.eval(expression).toString());
    }


    /**
     * 获得json内容
     */
    public static Object getJsonValue(JSONObject jsonValue, String keyStr){
        if (StringUtils.isBlank(keyStr)){
            return "";
        }

        // 是否为时间格式需要转换
        String parameterDateType = null;
        String resultDateType = null;
        if (keyStr.indexOf(",") > 0){// 包含格式信息
            String[] parameterArray = keyStr.split(",");
            keyStr = parameterArray[0].trim();
            // 格式参数
            Map<String, String> map = ParseUtils.getParameterMap(parameterArray);
            parameterDateType = map.get("parameterDateType");
            resultDateType = map.get("resultDateType");
        }

        String[] keyArray = keyStr.split("\\.");
        if (keyArray == null || keyArray.length <= 0){
            throw new BusinessException("参数格式不正确:" + keyStr);
        }

        if (parameterDateType != null){
            return ParseUtils.getJsonDateValue(jsonValue, keyArray, parameterDateType, resultDateType);
        }else {
            return ParseUtils.getJsonValue(jsonValue, keyArray);
        }
    }

    /**
     * 获得json内容
     */
    public static Object getJsonValue(JSONObject json, String[] keyArray){
        Object jsonValue = json;
        for (int i = 1; i < keyArray.length; i++){
            String itemKey = keyArray[i];
            if (StringUtils.isBlank(itemKey) || jsonValue == null){
                continue;
            }
            if (jsonValue instanceof JSONObject){
                jsonValue = ((JSONObject) jsonValue).get(itemKey);
            }else if (jsonValue instanceof JSONArray){
                if (Objects.equals(itemKey, "length") || Objects.equals(itemKey, "size")){
                    jsonValue = ((JSONArray) jsonValue).size();
                }else {
                    jsonValue = null;
                }
            }else {
                jsonValue = null;
            }
        }

        return jsonValue;
    }

    /**
     * 获得时间值
     */
    public static String getJsonDateValue(JSONObject json, String[] keyArray, String parameterDateType, String resultDateType){
        Object jsonValue = getJsonValue(json, keyArray);
        if (jsonValue == null){
            return null;
        }

        Date date = null;
        if (jsonValue instanceof Date){
            date = (Date) jsonValue;
        }else {
            if (StringUtils.isNotBlank(parameterDateType)){
                String dateStr = jsonValue.toString();
                parameterDateType = parameterDateType.replace("'", "").replace("\"", "");
                try{
                    SimpleDateFormat sdf = new SimpleDateFormat(parameterDateType);
                    date = sdf.parse(dateStr);
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
        }

        if (date == null){
            return null;
        }
        if (StringUtils.isNotBlank(resultDateType)){
            resultDateType = resultDateType.replace("'", "").replace("\"", "");
            return DateHelper.formatDate(date, resultDateType);
        }else {
            return DateHelper.formatDate(date, DateHelper.COMMON_DATE_FORMAT);
        }
    }

    /**
     * 解析参数
     * @return
     */
    public static Map<String, String> getParameterMap(String[] parameterArray){
        Map<String, String> map = new HashMap<>();
        if (parameterArray != null && parameterArray.length > 0){
            for (String parameter : parameterArray){
                String[] array = parameter.split("=");
                if (array.length == 2){
                    map.put(StringUtils.trim(array[0]), StringUtils.trim(array[1]));
                }
            }
        }
        return map;
    }

    /**
     * 根据模板列表解析数据
     */
    public static DirectResponseData parseJsonByTempList(List<TabBankDirectInterfaceTemp> receiveTempList, JSONObject jsonData, DirectResponseData directResponseData) throws Exception {
        receiveTempList = receiveTempList.stream().sorted((item1, item2) -> item2.getPriority() - item1.getPriority()).collect(Collectors.toList());
        for (int i = 0; i < receiveTempList.size(); i++){
            TabBankDirectInterfaceTemp receiveTemp = receiveTempList.get(i);
            // 判断是否使用当前模板解析
            if (ParseUtils.parseEstimateExpression(jsonData, receiveTemp.getCheckExpress())){
                // 将结果解析为固定格式
                Object parseJsonData = JSONTempParseFactory.getJSONTempParseFactory().parseJsonTemp(receiveTemp.getTemplate(), jsonData);
                if (parseJsonData instanceof JSONObject){
                    directResponseData.setParseJsonData((JSONObject) parseJsonData);
                    directResponseData.setParseTemplateId(receiveTemp.getId());
                    directResponseData.setTabBankDirectInterfaceTemp(receiveTemp);
                }
                break;
            }
        }
        return directResponseData;
    }

    /**
     * 获得接口适配器
     */
    public static DirectInterFaceHandler getHandler(String handlerClassPath){
        if (StringUtils.isNotBlank(handlerClassPath)){
            try {
                Class cla = Class.forName(handlerClassPath);
                Method getHandlerMethod = cla.getMethod("getHandler");
                Object obj = getHandlerMethod.invoke(cla);
                if (obj instanceof DirectInterFaceHandler){
                    return (DirectInterFaceHandler) obj;
                }
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }
        return null;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值