java 拆分map_Java版本:识别Json字符串并分隔成Map集合

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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值