你不應該使用Gson
做出這樣的驗證:
Gson
是執行反序列化,因此它反序列化整個 JSON作爲一個對象在內存中的對象。
Gson
,我不知道它,對於一些無效的JSON可能不是很嚴格:bncjbhjfjhj
被反序列化爲java.lang.String
實例。驚喜,驚喜!
private static final Gson gson = new Gson();
private static final String VALID_JSON = "{\"status\": \"UP\"}";
private static final String INVALID_JSON = "bncjbhjfjhj";
System.out.println(gson.fromJson(VALID_JSON, Object.class).getClass());
System.out.println(gson.fromJson(INVALID_JSON, Object.class).getClass());
輸出:
類com.google.gson.internal.LinkedTreeMap
類java.lang.String
,你可以在這裏做什麼用JsonReader
到通過令牌讀取傳入的JSON令牌,從而使給定的JSON文檔在語法上有效。
private static boolean isJsonValid(final String json)
throws IOException {
return isJsonValid(new StringReader(json));
}
private static boolean isJsonValid(final Reader reader)
throws IOException {
return isJsonValid(new JsonReader(reader));
}
private static boolean isJsonValid(final JsonReader jsonReader)
throws IOException {
try {
JsonToken token;
loop:
while ((token = jsonReader.peek()) != END_DOCUMENT && token != null) {
switch (token) {
case BEGIN_ARRAY:
jsonReader.beginArray();
break;
case END_ARRAY:
jsonReader.endArray();
break;
case BEGIN_OBJECT:
jsonReader.beginObject();
break;
case END_OBJECT:
jsonReader.endObject();
break;
case NAME:
jsonReader.nextName();
break;
case STRING:
case NUMBER:
case BOOLEAN:
case NULL:
jsonReader.skipValue();
break;
case END_DOCUMENT:
break loop;
default:
throw new AssertionError(token);
}
}
return true;
} catch (final MalformedJsonException ignored) {
return false;
}
}
並對其進行測試:
System.out.println(isJsonValid(VALID_JSON));
System.out.println(isJsonValid(INVALID_JSON));
輸出:
真
假
你找誰模式驗證? – efekctive