1.Fastjson
我们通常在已知格式的情况下直接使用JSONObject,JSONArray,但是如果遇到需要判断格式呢?
try@H_404_13@{
Object object @H_404_13@= JSON.parse(a);
@H_404_13@if@H_404_13@ (object instanceof@H_404_13@ JSONObject){
@H_404_13@//@H_404_13@JSONObject@H_404_13@
}
@H_404_13@if@H_404_13@ (object instanceof@H_404_13@ JSONArray){
@H_404_13@//@H_404_13@JSONArray@H_404_13@
}
}@H_404_13@catch@H_404_13@ (com.alibaba.fastjson.JSONException e){
@H_404_13@//@H_404_13@非JSON字符串@H_404_13@
}
2.org.json.JSON
直接使用JSON库做解析的情况不多,但是这里也稍微写一下
log.info(JSON.parse(jsonStr).getClass().getName());
@H_404_13@try@H_404_13@ {
Object json @H_404_13@= new@H_404_13@ JSONTokener(jsonStr).nextValue();
log.info( json.getClass().toString());
@H_404_13@//@H_404_13@ json.toString();@H_404_13@
if@H_404_13@(json instanceof@H_404_13@ JSONObject){
log.info(@H_404_13@"is JSONObject");
JSONObject jsonObject @H_404_13@= (JSONObject)json;
@H_404_13@//@H_404_13@further actions on jsonObjects
@H_404_13@//@H_404_13@...@H_404_13@
}else@H_404_13@ if@H_404_13@ (json instanceof@H_404_13@ JSONArray){
log.info(@H_404_13@"is JSONArray");
JSONArray jsonArray @H_404_13@= (JSONArray)json;
@H_404_13@//@H_404_13@further actions on jsonArray
@H_404_13@//@H_404_13@...@H_404_13@
}
}@H_404_13@catch@H_404_13@ (Exception e){
e.printStackTrace();
}@H_404_13@
3.GSON,也是蛮强大的一个库,没有依赖包,只是在反射到Map的使用上有点麻烦。
GSON里面最有意思的就是JsonPrimitive,原始JSON。
先给代码
String str = "";
JsonParser jsonParser @H_404_13@= new@H_404_13@ JsonParser();
@H_404_13@try@H_404_13@{
JsonElement jsonElement @H_404_13@= jsonParser.parse(str);
log.info(@H_404_13@"jsonElement "+jsonElement.getClass().getName());
@H_404_13@if@H_404_13@ (jsonElement.isJsonObject()){
@H_404_13@//@H_404_13@JsonObject@H_404_13@
log.info(jsonElement.getAsJsonObject().get("aa").getAsString());
}
@H_404_13@if@H_404_13@ (jsonElement.isJsonArray()){
@H_404_13@//@H_404_13@JsonArray@H_404_13@
log.info(jsonElement.getAsJsonArray().get(0).getAsJsonObject().get("aa").getAsString());
}
@H_404_13@if@H_404_13@ (jsonElement.isJsonNull()){
@H_404_13@//@H_404_13@空字符串@H_404_13@
log.info(jsonElement.getAsString());
}
@H_404_13@if@H_404_13@ (jsonElement.isJsonPrimitive()){
log.info(jsonElement.getAsString());
}
}@H_404_13@catch@H_404_13@ (Exception e){
@H_404_13@//@H_404_13@非法
@H_404_13@//@H_404_13@ e.printStackTrace();@H_404_13@
log.info("非法 "+e.getMessage());
}@H_404_13@
可知,GSON中定义了四个JSON类型,分别是JSONObject,JSONArray,JSONPrimitive,JSONNull。
但是官方对JSON的严格定义是{}为JSONObject,[]为JSONArray。
所以只用JsonElement jsonElement = jsonParser.parse(str);能正常解析的字符串并不意味着是一个合法的JSON,必须满足
jsonElement.isJsonObject()或者jsonElement.isJsonArray()。
另说一个题外话,关于对jsonElement.getAsJsonPrimitive()方法的理解。
JsonPrimitive即时指JSON value的原始数据,包含三种类型,数字,双引号包裹的字符串,布尔。
所以JsonPrimitive.toString得到的不是实际的值,而是JSON中的:后面的完整内容,需要再做一次getAs。
例如
String str = "{\"aa\":\"aa\"}";
JsonElement jsonElement @H_404_13@= jsonParser.parse(str);
log.info(jsonElement.getAsJsonObject().get(@H_404_13@"aa").getAsString());
str @H_404_13@= "{\"aa\":true}";
jsonElement @H_404_13@= jsonParser.parse(str);
jsonElement.getAsJsonObject().get(@H_404_13@"aa").getAsBoolean();
str @H_404_13@= "{\"aa\":1.2}";
jsonElement.getAsJsonObject().get(@H_404_13@"aa").getAsBigDecimal();
所以Gson还有一个好处就是自带转换为java常规类型。