You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					
					
						
							468 lines
						
					
					
						
							15 KiB
						
					
					
				
			
		
		
	
	
							468 lines
						
					
					
						
							15 KiB
						
					
					
				| package com.ynxbd.common.result;
 | |
| 
 | |
| 
 | |
| import com.alibaba.fastjson.JSONArray;
 | |
| import com.alibaba.fastjson.JSONObject;
 | |
| import com.alibaba.fastjson.annotation.JSONField;
 | |
| import com.fasterxml.jackson.annotation.JsonIgnore;
 | |
| import com.ynxbd.common.helper.common.ErrorHelper;
 | |
| import com.ynxbd.common.helper.common.JsonHelper;
 | |
| import lombok.*;
 | |
| import lombok.extern.slf4j.Slf4j;
 | |
| import org.apache.http.HttpStatus;
 | |
| import org.dom4j.Attribute;
 | |
| import org.dom4j.Document;
 | |
| import org.dom4j.DocumentHelper;
 | |
| import org.dom4j.Element;
 | |
| 
 | |
| import java.math.BigDecimal;
 | |
| import java.util.HashMap;
 | |
| import java.util.List;
 | |
| import java.util.Map;
 | |
| import java.util.Set;
 | |
| 
 | |
| @Slf4j
 | |
| @Getter
 | |
| @Setter(AccessLevel.PRIVATE)
 | |
| @ToString
 | |
| public class JsonResult {
 | |
|     public String code;
 | |
|     private String message;
 | |
|     // 数据
 | |
|     private Map<String, Object> dataMap;
 | |
|     // 成功编码--判断请求是否成功
 | |
|     private String successCode;
 | |
|     // 超时/错误编码
 | |
|     private String timeoutCode;
 | |
| 
 | |
|     @FunctionalInterface
 | |
|     public interface MapParams {
 | |
|         void setParams(Map<String, Object> map);
 | |
|     }
 | |
| 
 | |
|     private JsonResult() {
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 请求成功
 | |
|      */
 | |
|     @JsonIgnore
 | |
|     @JSONField(serialize = false)
 | |
|     public boolean success() {
 | |
|         return this.code.equals(this.successCode);
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 请求成功
 | |
|      */
 | |
|     @JsonIgnore
 | |
|     @JSONField(serialize = false)
 | |
|     public boolean isTimeout() {
 | |
|         return this.code.equals(this.timeoutCode);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 创建一个异常信息
 | |
|      */
 | |
|     public static JsonResult createErrorResult(JsonResultEnum jsonResultEnum) {
 | |
|         return createResult(jsonResultEnum.getERROR_CODE(), String.format("【%s】调用失败", jsonResultEnum.getSYS()), jsonResultEnum);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 创建一个异常信息
 | |
|      */
 | |
|     public static JsonResult createErrorResult(String message, JsonResultEnum jsonResultEnum) {
 | |
|         return createResult(jsonResultEnum.getERROR_CODE(), message, jsonResultEnum);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 创建一个超时信息
 | |
|      */
 | |
|     public static JsonResult createTimeoutResult(String message, JsonResultEnum jsonResultEnum) {
 | |
|         return createResult(jsonResultEnum.getTIMEOUT_CODE(), message, jsonResultEnum);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 创建一个异常信息
 | |
|      */
 | |
|     public static JsonResult createResult(@NonNull String code, @NonNull String message, JsonResultEnum jsonResultEnum) {
 | |
|         JsonResult result = new JsonResult();
 | |
|         result.code = code;
 | |
|         result.message = message;
 | |
|         result.successCode = jsonResultEnum.getSUCCESS_CODE();
 | |
|         if (jsonResultEnum.getTIMEOUT_CODE() == null) {
 | |
|             result.timeoutCode = String.valueOf(HttpStatus.SC_REQUEST_TIMEOUT);
 | |
|         } else {
 | |
|             result.timeoutCode = jsonResultEnum.getTIMEOUT_CODE();
 | |
|         }
 | |
|         return result;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 请求成功
 | |
|      */
 | |
|     public static JsonResult jsonToBean(String respData, JsonResultEnum jsonResultEnum) {
 | |
|         if (respData == null) {
 | |
|             return null;
 | |
|         }
 | |
|         return mapToResult(JsonHelper.parseObject(respData), jsonResultEnum);
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * xml数据转对象
 | |
|      *
 | |
|      * @param xml          xml数据
 | |
|      * @param ignoreParams 需要忽略的字段(可选)
 | |
|      * @return JsonResult
 | |
|      */
 | |
|     public static JsonResult xmlToBean(String xml, JsonResultEnum jsonResultEnum, String... ignoreParams) {
 | |
|         try {
 | |
|             if (xml == null || "".equals(xml)) {
 | |
|                 log.info("【{}】 response xml is null", jsonResultEnum.getSYS());
 | |
|                 return null; // 不能判断是否为调用超时
 | |
|             }
 | |
| 
 | |
|             Document document = DocumentHelper.parseText(xml);
 | |
|             Element root = document.getRootElement(); // 获取根节点元素对象
 | |
| 
 | |
|             JSONObject respObj = nodeToJsonObject(root);
 | |
|             return mapToResult(respObj, jsonResultEnum, ignoreParams);
 | |
|         } catch (Exception e) {
 | |
|             ErrorHelper.println(e);
 | |
|             return null;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private static JsonResult mapToResult(JSONObject respObj, JsonResultEnum jsonResultEnum, String... ignoreParams) {
 | |
|         JsonResult result = new JsonResult();
 | |
|         Map<String, Object> map = new HashMap<>();
 | |
|         Set<String> keys = respObj.keySet();
 | |
|         for (String key : keys) {
 | |
|             if (ignoreParams != null && ignoreParams.length > 0) {
 | |
|                 for (String ignoreParam : ignoreParams) {
 | |
|                     if (key.equals(ignoreParam)) {
 | |
|                         break;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             if (jsonResultEnum.getCODE_NODE().equals(key)) {
 | |
|                 result.code = respObj.getString(key);
 | |
|                 continue;
 | |
|             }
 | |
|             if (jsonResultEnum.getMESSAGE_NODE().equals(key)) {
 | |
|                 result.message = respObj.getString(key);
 | |
|                 continue;
 | |
|             }
 | |
|             map.put(key, respObj.getString(key));
 | |
|         }
 | |
|         result.setDataMap(map);
 | |
|         result.dataMap = map;
 | |
|         result.successCode = jsonResultEnum.getSUCCESS_CODE();
 | |
|         if (jsonResultEnum.getTIMEOUT_CODE() == null) {
 | |
|             result.timeoutCode = String.valueOf(HttpStatus.SC_REQUEST_TIMEOUT);
 | |
|         } else {
 | |
|             result.timeoutCode = jsonResultEnum.getTIMEOUT_CODE();
 | |
|         }
 | |
|         if (!result.success()) {
 | |
|             log.info("{} Error Message:[{}]", jsonResultEnum.getSYS(), result.message);
 | |
|         }
 | |
|         return result;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 递归-Element转JSONObject
 | |
|      *
 | |
|      * @param rootNode 根节点
 | |
|      * @return JSONObject
 | |
|      */
 | |
|     public static JSONObject nodeToJsonObject(Element rootNode) {
 | |
|         JSONObject result = new JSONObject();
 | |
|         // 当前节点的名称、文本内容和属性
 | |
|         for (Attribute o : rootNode.attributes()) {// 遍历当前节点的所有属性
 | |
|             result.put(o.getName(), o.getValue());
 | |
|         }
 | |
| 
 | |
|         // 递归遍历当前节点所有的子节点
 | |
|         List<Element> listElement = rootNode.elements();// 所有一级子节点的list
 | |
|         if (!listElement.isEmpty()) {
 | |
|             String name, content;
 | |
|             for (Element e : listElement) {// 遍历所有一级子节点
 | |
|                 name = e.getName();
 | |
|                 content = e.getTextTrim();
 | |
|                 if (e.attributes().isEmpty() && e.elements().isEmpty()) // 判断一级节点是否有属性和子节点
 | |
|                     result.put(name, "".equals(content) ? null : content); // 沒有则将当前节点作为上级节点的属性对待
 | |
|                 else {
 | |
|                     if (!result.containsKey(e.getName())) {  // 判断父节点是否存在该一级节点名称的属性
 | |
|                         result.put(name, new JSONArray());// 没有则创建
 | |
|                     }
 | |
|                     JSONArray jsonArray = (JSONArray) result.get(name);
 | |
|                     jsonArray.add(nodeToJsonObject(e)); // 将该一级节点放入该节点名称的属性对应的值中
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         return result;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 获取DataMap的值 String
 | |
|      *
 | |
|      * @param nodeName 节点名称
 | |
|      * @return nodeVal 节点值
 | |
|      */
 | |
|     public String getDataMapString(String nodeName) {
 | |
|         try {
 | |
|             Object val = this.dataMap.get(nodeName);
 | |
|             return val == null ? null : val.toString().trim();
 | |
|         } catch (Exception e) {
 | |
|             ErrorHelper.println(e);
 | |
|             return null;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 获取DataMap的值 BigDecimal
 | |
|      *
 | |
|      * @param nodeName 节点名称
 | |
|      * @return nodeVal 节点值
 | |
|      */
 | |
|     public BigDecimal getDataMapBigDecimal(String nodeName) {
 | |
|         try {
 | |
|             Object val = this.dataMap.get(nodeName);
 | |
|             return val == null ? null : new BigDecimal(val.toString());
 | |
|         } catch (Exception e) {
 | |
|             ErrorHelper.println(e);
 | |
|             return null;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 获取DataMap的值 Integer
 | |
|      *
 | |
|      * @param nodeName 节点名称
 | |
|      * @return nodeVal 节点值
 | |
|      */
 | |
|     public Integer getDataMapInteger(String nodeName) {
 | |
|         try {
 | |
|             Object val = this.dataMap.get(nodeName);
 | |
|             return val == null ? null : Integer.parseInt(val.toString());
 | |
|         } catch (Exception e) {
 | |
|             ErrorHelper.println(e);
 | |
|             return null;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 获取DataMap的值 Boolean
 | |
|      *
 | |
|      * @param nodeName 节点名称
 | |
|      * @return nodeVal 节点值
 | |
|      */
 | |
|     public Boolean getDataMapBoolean(String nodeName) {
 | |
|         try {
 | |
|             Object val = this.dataMap.get(nodeName);
 | |
|             return val == null ? null : Boolean.parseBoolean(val.toString());
 | |
|         } catch (Exception e) {
 | |
|             ErrorHelper.println(e);
 | |
|             return null;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 获取DataMap的值 Long
 | |
|      *
 | |
|      * @param nodeName 节点名称
 | |
|      * @return nodeVal 节点值
 | |
|      */
 | |
|     public Long getDataMapLong(String nodeName) {
 | |
|         try {
 | |
|             Object val = this.dataMap.get(nodeName);
 | |
|             return val == null ? null : Long.parseLong(val.toString());
 | |
|         } catch (Exception e) {
 | |
|             ErrorHelper.println(e);
 | |
|             return null;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 获取DataMap的值 Double
 | |
|      *
 | |
|      * @param nodeName 节点名称
 | |
|      * @return nodeVal 节点值
 | |
|      */
 | |
|     public Double getDataMapDouble(String nodeName) {
 | |
|         try {
 | |
|             Object val = this.dataMap.get(nodeName);
 | |
|             return val == null ? null : Double.parseDouble(val.toString());
 | |
|         } catch (Exception e) {
 | |
|             ErrorHelper.println(e);
 | |
|             return null;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 获取根节点包含相同节点数据
 | |
|      * 如:
 | |
|      * <roots>
 | |
|      * # <root>1</root>
 | |
|      * # <root>2</root>
 | |
|      * </roots>
 | |
|      *
 | |
|      * @param clazz    类型
 | |
|      * @param rootNode 根节点名
 | |
|      * @param nodes    子节点名,可变长参数
 | |
|      * @return 集合
 | |
|      */
 | |
|     public <T> List<T> getDataMapList(Class<T> clazz, String rootNode, String... nodes) {
 | |
|         JSONArray jsonArray = getJsonArray(rootNode, nodes);
 | |
|         return JsonHelper.decodeList(jsonArray.toString(), clazz);
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 获取嵌套多层的JSONArray
 | |
|      *
 | |
|      * @param rooNode 根节点
 | |
|      * @param nodes   子节点,可变长参数
 | |
|      * @return json数组
 | |
|      */
 | |
|     public JSONArray getJsonArray(String rooNode, String... nodes) {
 | |
|         Object rootObj = this.dataMap.get(rooNode);
 | |
|         String result = rootObj == null ? JsonHelper.toJsonString(new JSONArray()) : rootObj.toString();
 | |
|         try {
 | |
|             JSONArray jsonArray;
 | |
|             JSONObject jsonObject;
 | |
|             for (String node : nodes) {
 | |
|                 jsonArray = JsonHelper.parseArray(result);
 | |
|                 if (jsonArray == null || jsonArray.size() == 0) {
 | |
|                     return new JSONArray();
 | |
|                 }
 | |
|                 if (jsonArray.size() == 1) { // 如果只有一个值继续处理
 | |
|                     jsonObject = jsonArray.getJSONObject(0);
 | |
|                     result = JsonHelper.toJsonString(jsonObject.getJSONArray(node));
 | |
|                 } else { // 如果有多个值返回当前数组
 | |
|                     result = JsonHelper.toJsonString(jsonArray);
 | |
|                 }
 | |
|             }
 | |
|         } catch (Exception e) {
 | |
|             log.error("JSON数据转换失败");
 | |
|             ErrorHelper.println(e);
 | |
|         }
 | |
|         return JSONArray.parseArray(result);
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * JSON树形结构数据向下JSONArray中传递
 | |
|      *
 | |
|      * @param jsonArray  根节点
 | |
|      * @param properties 节点属性,可变长参数
 | |
|      * @return JSONArray
 | |
|      */
 | |
|     public <T> List<T> jsonParentToChild(Class<T> clazz, JSONArray jsonArray, String rootNode, String... properties) {
 | |
|         JSONArray result = new JSONArray();
 | |
|         JSONObject jsonObject, childNode;
 | |
|         JSONArray nodeJsonArr;
 | |
|         for (int i = 0; i < jsonArray.size(); i++) {
 | |
|             jsonObject = jsonArray.getJSONObject(i);
 | |
|             nodeJsonArr = jsonObject.getJSONArray(rootNode);
 | |
|             for (int j = 0; j < nodeJsonArr.size(); j++) {
 | |
|                 childNode = nodeJsonArr.getJSONObject(j);
 | |
|                 for (String property : properties) {
 | |
|                     for (String key : jsonObject.keySet()) { // 忽略大小写
 | |
|                         if (key.equalsIgnoreCase(property)) {
 | |
|                             property = key;
 | |
|                             break;
 | |
|                         }
 | |
|                     }
 | |
|                     String propertyVal = jsonObject.getString(property);
 | |
|                     childNode.put(property, propertyVal);
 | |
|                 }
 | |
|                 result.add(childNode);
 | |
|             }
 | |
|         }
 | |
|         return JsonHelper.decodeList(JsonHelper.toJsonString(result), clazz);
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 获取DataMap为bean
 | |
|      *
 | |
|      * @param clazz 类型
 | |
|      * @return bean
 | |
|      */
 | |
|     public <T> T dataMapToBean(Class<T> clazz) {
 | |
|         return JsonHelper.decodeBean(JsonHelper.toJsonString(this.dataMap), clazz);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 获取DataMap为bean
 | |
|      *
 | |
|      * @param clazz 类型
 | |
|      * @return bean
 | |
|      */
 | |
|     public <T> T dataMapToBean(Class<T> clazz, String rooNode, String... nodes) {
 | |
|         JSONObject jsonObject = getJsonObject(rooNode, nodes);
 | |
|         if (jsonObject == null) {
 | |
|             jsonObject = new JSONObject();
 | |
|         }
 | |
|         return JsonHelper.decodeBean(jsonObject, clazz);
 | |
|     }
 | |
| 
 | |
| //    /**
 | |
| //     * 获取DataMap为bean
 | |
| //     *
 | |
| //     * @param rooNode 根节点
 | |
| //     * @param nodes   子节点
 | |
| //     * @return bean
 | |
| //     */
 | |
| //    public JSONObject getDataMapObject(String rooNode, String... nodes) {
 | |
| //        JSONObject jsonObject = getJsonObject(rooNode, nodes);
 | |
| //        if (jsonObject == null) {
 | |
| //            jsonObject = new JSONObject();
 | |
| //        }
 | |
| //        return decodeBean(jsonObject.toJSONString());
 | |
| //    }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 获取嵌套多层的JSONArray
 | |
|      *
 | |
|      * @param rooNode 根节点
 | |
|      * @param nodes   子节点,可变长参数
 | |
|      * @return json对象
 | |
|      */
 | |
|     public JSONObject getJsonObject(String rooNode, String... nodes) {
 | |
|         Object rootObj = this.dataMap.get(rooNode);
 | |
|         String result = rootObj == null ? new JSONObject().toJSONString() : rootObj.toString();
 | |
|         try {
 | |
|             JSONArray jsonArray = JSONArray.parseArray(result);
 | |
|             if (jsonArray == null || jsonArray.size() == 0) {
 | |
|                 return new JSONObject();
 | |
|             }
 | |
| 
 | |
|             JSONObject jsonObject = jsonArray.getJSONObject(0);
 | |
|             if (jsonObject == null) {
 | |
|                 return new JSONObject();
 | |
|             }
 | |
| 
 | |
|             if (nodes.length == 0) {
 | |
|                 result = jsonObject.toJSONString();
 | |
|             }
 | |
| 
 | |
|             for (String node : nodes) {
 | |
|                 result = jsonObject.getJSONObject(node).toJSONString();
 | |
|             }
 | |
|         } catch (Exception e) {
 | |
|             log.error("JSON数据转换失败");
 | |
|             ErrorHelper.println(e);
 | |
|         }
 | |
|         return JsonHelper.parseObject(result);
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 |