package com.java110.utils.util;
|
|
import com.alibaba.fastjson.JSONObject;
|
import com.java110.utils.log.LoggerEngine;
|
|
import java.text.SimpleDateFormat;
|
|
/**
|
* JSON 格式字符串解析
|
* Created by wuxw on 2017/7/23.
|
*/
|
public class StringJsonDeal extends LoggerEngine{
|
|
|
private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyyMMddHHmmss");
|
|
private JSONObject jsonObject = null;
|
|
public StringJsonDeal(String jsonString){
|
try {
|
jsonObject = JSONObject.parseObject(jsonString);
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
|
|
|
|
public StringJsonDeal(JSONObject jsonObject) {
|
this.jsonObject = jsonObject;
|
}
|
|
|
|
|
/**
|
* 对逻辑字符串进行分析和运算
|
*
|
* @param jsonString
|
* @param keyIdentifyLogicInfo
|
* @return
|
* @throws
|
*/
|
public static boolean logicCalculus(String jsonString, String keyIdentifyLogicInfo) throws Exception {
|
final String PART_STRING_DBL_AMPERSAND = "&&"; //表示字符串:&&
|
final String PART_STRING_DBL_VERTICAL_BAR = "||"; //表示字符串:||
|
final String PART_STRING_L_BIG_BRACKET = "{"; //表示字符串:{
|
final String PART_STRING_R_BIG_BRACKET = "}"; //表示字符串:}
|
final String PRVT_TRUE_STR = "1";
|
final String PRVT_FALSE_STR = "0";
|
final String PRVT_OR_BLANK_STR = " || ";
|
String keyIdentifyLogicStr = keyIdentifyLogicInfo; //动态变化的关键判断逻辑信息
|
while (keyIdentifyLogicStr.contains(PART_STRING_L_BIG_BRACKET)
|
&& keyIdentifyLogicStr.contains(PART_STRING_R_BIG_BRACKET)
|
|| keyIdentifyLogicStr.contains(PART_STRING_DBL_AMPERSAND)
|
|| keyIdentifyLogicStr.contains(PART_STRING_DBL_VERTICAL_BAR)
|
|| !PRVT_TRUE_STR.equals(keyIdentifyLogicStr) && !PRVT_FALSE_STR.equals(keyIdentifyLogicStr)) {
|
int leftBigBracketPosition = 0; //最内左大括号的位置
|
int rightBigBracketPosition = 0; //最内右大括号的位置
|
String curProcessStr = keyIdentifyLogicStr; //当前要处理的字符串片断
|
if (keyIdentifyLogicStr.contains(PART_STRING_L_BIG_BRACKET)
|
&& keyIdentifyLogicStr.contains(PART_STRING_R_BIG_BRACKET)) {
|
leftBigBracketPosition = keyIdentifyLogicStr.lastIndexOf(PART_STRING_L_BIG_BRACKET);
|
rightBigBracketPosition = keyIdentifyLogicStr
|
.indexOf(PART_STRING_R_BIG_BRACKET, leftBigBracketPosition);
|
curProcessStr = keyIdentifyLogicStr.substring(leftBigBracketPosition + 1, rightBigBracketPosition);
|
}
|
String rsltLogicStr = "";
|
if (curProcessStr.contains(PART_STRING_DBL_VERTICAL_BAR)) {
|
String[] orLogicStrs = curProcessStr.split("\\|\\|"); //“或”逻辑信息
|
int orLogicStrNum = orLogicStrs.length;
|
String curOrLogicStr = "";
|
String curAndLogicStr = "";
|
String orLogicStr = "";
|
String andLogicStr = "";
|
boolean hasTrue = false;
|
for (int i = 0; i < orLogicStrNum; i++) {
|
curOrLogicStr = orLogicStrs[i];
|
if (null != curOrLogicStr) {
|
curOrLogicStr = curOrLogicStr.trim();
|
}
|
if (null == curOrLogicStr || "".equals(curOrLogicStr)) {
|
throw new Exception("字段配置错误,两个||之间不能没有信息");
|
}
|
orLogicStr = PRVT_FALSE_STR;
|
if (curOrLogicStr.contains(PART_STRING_DBL_AMPERSAND)) {
|
String[] andLogicStrs = curOrLogicStr.split(PART_STRING_DBL_AMPERSAND); //“与”逻辑信息
|
int andLogicStrNum = andLogicStrs.length;
|
andLogicStr = PRVT_TRUE_STR;
|
for (int j = 0; j < andLogicStrNum; j++) {
|
curAndLogicStr = andLogicStrs[j];
|
if (null != curAndLogicStr) {
|
curAndLogicStr = curAndLogicStr.trim();
|
}
|
if (null == curAndLogicStr || "".equals(curAndLogicStr)) {
|
throw new Exception("字段配置错误,两个&&之间不能没有信息");
|
}
|
if (!jsonString.contains(curAndLogicStr) || PRVT_FALSE_STR.equals(curAndLogicStr)) {
|
andLogicStr = PRVT_FALSE_STR;
|
break;
|
}
|
}
|
if ("".equals(rsltLogicStr)) {
|
rsltLogicStr = andLogicStr;
|
} else {
|
rsltLogicStr += PRVT_OR_BLANK_STR + andLogicStr;
|
}
|
} else {
|
if (jsonString.contains(curOrLogicStr) || PRVT_TRUE_STR.equals(curOrLogicStr)) {
|
if (!hasTrue) {
|
orLogicStr = PRVT_TRUE_STR;
|
if ("".equals(rsltLogicStr)) {
|
rsltLogicStr = orLogicStr;
|
} else {
|
rsltLogicStr += PRVT_OR_BLANK_STR + orLogicStr;
|
}
|
hasTrue = true;
|
}
|
}
|
}
|
}
|
if (!hasTrue) {
|
if ("".equals(rsltLogicStr)) {
|
rsltLogicStr = orLogicStr;
|
} else {
|
rsltLogicStr += PRVT_OR_BLANK_STR + orLogicStr;
|
}
|
}
|
} else if (curProcessStr.contains(PART_STRING_DBL_AMPERSAND)) {
|
String[] andLogicStrs = curProcessStr.split(PART_STRING_DBL_AMPERSAND); //“与”逻辑信息
|
int andLogicStrNum = andLogicStrs.length;
|
String curAndLogicStr = "";
|
String andLogicStr = PRVT_TRUE_STR;
|
for (int j = 0; j < andLogicStrNum; j++) {
|
curAndLogicStr = andLogicStrs[j];
|
if (null != curAndLogicStr) {
|
curAndLogicStr = curAndLogicStr.trim();
|
}
|
if (null == curAndLogicStr || "".equals(curAndLogicStr)) {
|
throw new Exception("字段配置错误,两个&&之间不能没有信息");
|
}
|
if (!jsonString.contains(curAndLogicStr) || PRVT_FALSE_STR.equals(curAndLogicStr)) {
|
andLogicStr = PRVT_FALSE_STR;
|
break;
|
}
|
}
|
rsltLogicStr = andLogicStr;
|
} else {
|
String andLogicStr = PRVT_TRUE_STR;
|
if (!jsonString.contains(curProcessStr) || PRVT_FALSE_STR.equals(curProcessStr)) {
|
andLogicStr = PRVT_FALSE_STR;
|
}
|
rsltLogicStr = andLogicStr;
|
}
|
logger.debug("替换前判断逻辑字符串(keyIdentifyLogicStr) :{}", keyIdentifyLogicStr);
|
logger.debug("当前用于替换的逻辑字符串(rsltLogicStr) :{}", rsltLogicStr);
|
if (0 != rightBigBracketPosition) {
|
keyIdentifyLogicStr = keyIdentifyLogicStr.substring(0, leftBigBracketPosition) + rsltLogicStr
|
+ keyIdentifyLogicStr.substring(rightBigBracketPosition + 1);
|
} else {
|
keyIdentifyLogicStr = rsltLogicStr;
|
}
|
logger.debug("替换后判断逻辑字符串(keyIdentifyLogicStr) :{}", keyIdentifyLogicStr);
|
}
|
if (PRVT_TRUE_STR.equals(keyIdentifyLogicStr)) {
|
return true;
|
}
|
return false;
|
}
|
}
|