判断一个字符串是否是合法的JSON字符串
pom.xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.5</version>
</dependency>
java
代码
/**
* 暴力解析:Alibaba fastjson
* @param test
* @return
*/
public final static boolean isJSONValid(String test) {
try {
JSONObject.parseObject(test);
} catch (JSONException ex) {
try {
JSONObject.parseArray(test);
} catch (JSONException ex1) {
return false;
}
}
return true;
}
/**
* Jackson library
* @param jsonInString
* @return
*/
public final static boolean isJSONValid2(String jsonInString ) {
try {
final ObjectMapper mapper = new ObjectMapper();
mapper.readTree(jsonInString);
return true;
} catch (IOException e) {
return false;
}
}
/**
* Google Gson
* @param jsonInString
* @return
*/
public final static boolean isJSONValid3(String jsonInString) {
try {
gson.fromJson(jsonInString, Object.class);
return true;
} catch(JsonSyntaxException ex) {
return false;
}
}
测试结果
isJSONValid() | 16510 ms | 16161 ms | 2018 ms |
---|---|---|---|
isJSONValid2() | 17946 ms | 17486 ms | 2698 ms |
isJSONValid3() | 20648 ms | 20208 ms | 2508 ms |
区别
/**
* 是否是合法的Gson字符串
* @param targetStr
* @return
*/
private static boolean isGoodGson(String targetStr,Class clazz) {
if(StringUtils.isBlank(targetStr)){
return false;
}
try {
new Gson().fromJson(targetStr,clazz);
return true;
} catch(JsonSyntaxException ex) {
LOG.error("targetStr={} is not a valid {}",targetStr,clazz.getName(),ex);
return false;
}
}
/**
* 是否是合法的JsonArray (alibaba 认为前1种不是JSON串)
* 例如:[{a:b}] [{'a':'b'}] [{"a":"b"}]
* @param targetStr
* @return
*/
public static boolean isJsonArray(String targetStr){
return isGoodGson(targetStr,JsonArray.class);
}
/**
* 是否是合法的JsonObject(alibaba 认为前1种不是JSON串)
* 例如:{a:b} {'a':'b'} {"a":"b"}
* @param targetStr
* @return
*/
public static boolean isJsonObject(String targetStr){
return isGoodGson(targetStr,JsonObject.class);
}
结论
性能相差不太多,推荐方式二isJSONValid2()