JAVA校驗JSON資料格式最終版。

2021-09-12 04:18:55 字數 4881 閱讀 9921

在嘗試了兩次正規表示式進行校驗,依然存在嚴重效能問題的情況下,為了尋求新的思路我檢視了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 ...