在嘗試了兩次正規表示式進行校驗,依然存在嚴重效能問題的情況下,為了尋求新的思路我檢視了org.json的源**,並獲取了新的思路。
正規表示式校驗json實際也是從前到後遍歷字元與正規表示式進行匹配。使用正規表示式反而讓問題複雜化。按照原始碼解析的思路,使用指標遍歷字串進行驗證效能要更強大,速度更快。 以下是**~對json格式和正規表示式都有了較為深入的了解,還是很有收穫的!
public final class jsonvalidator
/** *方法名稱:json格式校驗
*概要說明:json 格式 在 [ ] , 字元前後可加注釋,以// #開頭、以\n \r 結尾,/* *\/ 三種注釋格式
* array [value .... value] object
* string不可包含雙引號以及控制字元 value 形式有 1.string 2.number 數字格式小數點後可不跟數字 e/e和+/-
* 後必須有數字 3/4.array/object格式與自身相同 5.true/false/null array 中可以存在 [,,,]
* object中不可存在或 由於只需正向遍歷一遍字元陣列,所以校驗速率非常之快!
* * 支援8000層+json巢狀,9000會引發stackoverflow 【string test =
* ""; for (int i = 0; i < 8000; i++) ");
* } test = test.replaceall("token",
* "\"test\":");】
* * string.copyof()上限限制校驗大小,本地測試上限約330m資料,校驗時間1196ms【 stringbuffer test = new
* "\"test\":,");
* "\"test\":}");】
* *
* @param rawvalue 字串引數
* * @return boolean 是否是json
*/public static boolean isjson(string rawvalue)
back();
return validatearray();
case '')
back();
return validateobject();
default:
return false;
}} catch (exception e)
}/**
* * @return char 下乙個有效實義字元 char<=' ' char!=127
* * @throws jsonexception 自定義json異常
*/public static char nextclean() throws jsonexception while (curchar != '\n' && curchar != '\r' && curchar != 0);
continue;
case 42: // '*'
do } while (curchar != '*');
if (next() == '/')
back();
} while (true);
}back();
return '/';
}if (curchar != '#')
do while (curchar != '\n' && curchar != '\r' && curchar != 0);
} while (true);
if (curchar != 0 && (curchar <= ' ' || curchar == 127))
return curchar;
}/**
* 若字元不在0-133內也將會返回空,否則移動指標返回下乙個字元
* * *
* @return char 下乙個字元
*/public static char next()
curchar = value.charat(index);
if (curchar <= 0) else
}/**
*/public static void back()
/** *方法名稱:拋出自定義json異常
*概要說明:
* * *
* @param message 異常自定義資訊
* * @return jsonexception 自定義json異常
*/public static jsonexception syntaxerror(string message)
/** *方法名稱:校驗jsonarray格式
*概要說明:
* * *
* @return boolean 是否是jsonarray
* * @throws jsonexception 自定義json異常
*/public static boolean validatearray() throws jsonexception else if (curchar == ',') else if (curchar == '"') else if (curchar == '-' || (curchar >= 48 && curchar <= 57)) else if (curchar == '
} else if (curchar == '[')
} else if (curchar == 't' || curchar == 'f' || curchar == 'n') else
switch (nextclean())
} while (true);
}/**
*方法名稱:校驗jsonobject格式
*概要說明:邏輯和array基本一樣
* * *
* @return boolean 是否是jsonobject
* * @throws jsonexception 自定義json異常
*/public static boolean validateobject() throws jsonexception ') else if (curchar == '"') else
if (nextclean() != ':')
nextclean();
if (curchar == ',') else if (curchar == '"') else if (curchar == '-' || (curchar >= 48 && curchar <= 57)) else if (curchar == '
} else if (curchar == '[')
} else if (curchar == 't' || curchar == 'f' || curchar == 'n') else
switch (nextclean()) ':
return true;
default:
return false;
}} while (true);
}/**
*方法名稱:校驗json string格式
*概要說明:
* * *
* @throws jsonexception 自定義json異常
*/public static void validatestring() throws jsonexception
if (curchar == 'u') }}
}} while (curchar >= ' ' && curchar != '"' && curchar != 127);
if (curchar == 0) else if (curchar != '"')
}/**
*方法名稱:校驗json number格式
*概要說明:
* * *
* @throws jsonexception 自定義json異常
*/public static void validatenumber() throws jsonexception
if (curchar > 48 && curchar <= 57) while (curchar >= 48 && curchar <= 57);
} else if (curchar == 48) else
if (curchar == '.') while (curchar >= 48 && curchar <= 57);
}if (curchar == 'e' || curchar == 'e')
if (curchar < 48 || curchar > 57)
do while (curchar >= 48 && curchar <= 57);
}back(); //指標移至數字值最後一位,取下一位即判斷是,或者],或者是合法注釋
}/**
*方法名稱:校驗json boolean/null格式
*概要說明:
* * *
* @throws jsonexception 自定義json異常
*/public static void validatebooleanandnull() throws jsonexception while (curchar >= ' ' && ",]#/".indexof(curchar) < 0 && curchar != 127);
if (!"null".equals(sb.tostring()) && !"true".equals(sb.tostring()) && !"false".equals(sb.tostring()))
back();
}
Json資料格式
在web 系統開發中,經常會碰到客戶端和伺服器端互動的問題,比如說客戶端傳送乙個 ajax 請求,然後在伺服器端進行計算,計算後返回結果,客戶端接收到這個響應結果並對它進行處理。那麼這個結果以一種什麼資料結構返回,客戶端才能比較容易和較好的處理呢?通過幾個專案的實踐,我發現 json 格式的資料是一...
JSON資料格式
下面這段文字,摘錄自留作備忘 21世紀初,douglas crockford尋找一種簡便的資料交換格式,能夠在伺服器之間交換資料。當時通用的資料交換語言是xml,但是douglas crockford覺得xml的生成和解析都太麻煩,所以他提出了一種簡化格式,也就是json。json的規格非常簡單,只...
json資料格式
json是一種與語言無關的資料交換的格式,作用 使用ajax進行前後臺資料交換 移動端與服務端的資料交換。1.物件格式 例如 user物件 或者 2.陣列 集合形式 例如 list用json資料格式表示 總結 1.物件格式和資料格式可以相互巢狀 例如 var json 取name 建寧 alert ...