packagecyq.data.tool;import java.util.*;importcyq.data.Log;public classJsonSplit
{public static booleanIsJson(String json)
{return IsJsonAndBackIndex(json)==-1;
}public static intIsJsonAndBackIndex(String json)
{if(json==null || json.isEmpty() || json.length()==1)
{return 0;
}if ((json.charAt(0) == '{' && json.charAt(json.length() - 1) == '}') ||(json.charAt(0)== '[' && json.charAt(json.length() - 1)== ']'))
{int errIndex = 0;
CharState cs= newCharState();charc;for (int i = 0; i < json.length(); i++)
{
c=json.charAt(i);if (SetCharState(c, cs) && cs.childrenStart)//设置关键符号状态。
{
String item=json.substring(i);int[] v=GetValueLength(item, true);int length = v[0];int err=v[1];
cs.childrenStart= false;if (err > 0)
{
errIndex= i +err;returnerrIndex;
}
i= i + length - 1;
}if(cs.isError)
{
errIndex=i;returnerrIndex;
}
}if( !cs.arrayStart && !cs.jsonStart)
{return -1;
}returnerrIndex;
}else{return 0;
}
}static List>Split(String json)
{
List> result = new ArrayList>();if (json!=null && !json.isEmpty())
{
LinkedHashMap dic = new LinkedHashMap();
String key= "";
StringBuilder value= newStringBuilder();
CharState cs= newCharState();try{//region 核心逻辑
charc;for (int i = 0; i < json.length(); i++)
{
c=json.charAt(i);if (!SetCharState(c, cs))//设置关键符号状态。
{if (cs.jsonStart)//Json进行中。。。
{if (cs.keyStart > 0)
{
key+=c;
}else if (cs.valueStart > 0)
{
value.append(c);//value += c;
}
}else if (!cs.arrayStart)//json结束,又不是数组,则退出。
{break;
}
}else if (cs.childrenStart)//正常字符,值状态下。
{
String item=json.substring(i);int[] v= GetValueLength(item, false);int length =v[0];//int temp=v[1];//value = item.SubString(0, length);
value.setLength(0);
value.append(item.substring(0, length));
cs.childrenStart= false;
cs.valueStart= 0;//cs.state = 0;
cs.setDicValue = true;
i= i + length - 1;
}if (cs.setDicValue)//设置键值对。
{if (key!=null && !key.isEmpty() && !dic.containsKey(key))
{//if (value != String.Empty)//{
boolean isNull = json.charAt(i - 5) == ':' && json.charAt(i) != '"' && value.length() == 4 && value.toString() == "null";if(isNull)
{
value.setLength(0);
}
dic.put(key, value.toString());//}
}
cs.setDicValue= false;
key= "";
value.setLength(0);
}if (!cs.jsonStart && dic.size() > 0)
{
result.add(dic);if (cs.arrayStart)//处理数组。
{
dic= new LinkedHashMap();
}
}
}//endregion
}catch(Exception err)
{
Log.WriteLogToTxt(err);
}finally{
key= null;
value.setLength(0);
value= null;
}
}returnresult;
}///
/// 获取值的长度(当Json值嵌套以"{"或"["开头时)
///
private static int[] GetValueLength(String json, booleanbreakOnErr)
{int errIndex = 0;int len = 0;if (json!=null && !json.isEmpty())
{
CharState cs= newCharState();charc;for (int i = 0; i < json.length(); i++)
{
c=json.charAt(i);if (!SetCharState(c, cs))//设置关键符号状态。
{if (!cs.jsonStart && !cs.arrayStart)//json结束,又不是数组,则退出。
{break;
}
}else if (cs.childrenStart)//正常字符,值状态下。
{int[] v=GetValueLength(json.substring(i), breakOnErr);//递归子值,返回一个长度。。。
int length = v[0];
errIndex=v[1];
cs.childrenStart= false;
cs.valueStart= 0;//cs.state = 0;
i = i + length - 1;
}if (breakOnErr &&cs.isError)
{
errIndex=i;break;
}if (!cs.jsonStart && !cs.arrayStart)//记录当前结束位置。
{
len= i + 1;//长度比索引+1
break;
}
}
}int[] valueAndErrIndex=new int[2];
valueAndErrIndex[0]=len;
valueAndErrIndex[1]=errIndex;returnvalueAndErrIndex;
}///
/// 设置字符状态(返回true则为关键词,返回false则当为普通字符处理)
///
private static boolean SetCharState(charc, CharState cs)
{switch(c)
{case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}]
if (cs.keyStart <= 0 && cs.valueStart <= 0)
{
cs.CheckIsError(c);if (cs.jsonStart && cs.state == 1)
{
cs.valueStart= 0;
cs.childrenStart= true;
}else{
cs.state= 0;
}
cs.jsonStart= true;//开始。
return true;
}break;case '}':if (cs.keyStart <= 0 && cs.valueStart < 2)
{
cs.CheckIsError(c);if(cs.jsonStart)
{
cs.jsonStart= false;//正常结束。
cs.valueStart = 0;
cs.setDicValue= true;
}return true;
}//cs.isError = !cs.jsonStart && cs.state == 0;
break;case '[':if (!cs.jsonStart)
{
cs.CheckIsError(c);
cs.arrayStart= true;return true;
}else if (cs.jsonStart && cs.state == 1 && cs.valueStart < 2)
{
cs.CheckIsError(c);//cs.valueStart = 1;
cs.childrenStart = true;return true;
}break;case ']':if (!cs.jsonStart && cs.keyStart <= 0 && cs.valueStart <= 0)
{
cs.CheckIsError(c);if (cs.arrayStart)//&& !cs.childrenStart
{
cs.arrayStart= false;
}return true;
}break;case '"':case '\'':
cs.CheckIsError(c);if(cs.jsonStart)
{if (cs.state == 0)//key阶段
{
cs.keyStart= (cs.keyStart <= 0 ? (c == '"' ? 3 : 2) : 0);return true;
}else if (cs.state == 1)//值阶段
{if (cs.valueStart <= 0)
{
cs.valueStart= (c == '"' ? 3 : 2);return true;
}else if ((cs.valueStart == 2 && c == '\'') || (cs.valueStart == 3 && c == '"'))
{if (!cs.escapeChar)
{
cs.valueStart= 0;return true;
}else{
cs.escapeChar= false;
}
}
}
}break;case ':':
cs.CheckIsError(c);if (cs.jsonStart && cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 0)
{
cs.keyStart= 0;
cs.state= 1;return true;
}//cs.isError = !cs.jsonStart || (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1);
break;case ',':
cs.CheckIsError(c);if (cs.jsonStart && cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1)
{
cs.state= 0;
cs.valueStart= 0;
cs.setDicValue= true;return true;
}else if (cs.arrayStart && !cs.jsonStart)
{return true;
}break;case ' ':case '\r':case '\n':if (cs.jsonStart && cs.keyStart <= 0 && cs.valueStart <= 0)
{return true;//跳过空格。
}break;default: //值开头。。
cs.CheckIsError(c);if (c == '\\') //转义符号
{if(cs.escapeChar)
{
cs.escapeChar= false;
}else{
cs.escapeChar= true;return true;
}
}else{
cs.escapeChar= false;
}if(cs.jsonStart)
{if (cs.keyStart <= 0 && cs.state <= 0)
{
cs.keyStart= 1;//无引号的
}else if (cs.valueStart <= 0 && cs.state == 1)
{
cs.valueStart= 1;//无引号的
}
}break;
}return false;
}
}