微信后端代码
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

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);
}
}