1. 程式人生 > >Fastjson, Gson, org.json.JSON三者對於JSONObject及JSONArray的判斷

Fastjson, Gson, org.json.JSON三者對於JSONObject及JSONArray的判斷

name 布爾 sbo str 有意思 boolean exc java 正常

1.Fastjson

我們通常在已知格式的情況下直接使用JSONObject,JSONArray,但是如果遇到需要判斷格式呢?

       try{
            Object object = JSON.parse(a);
            if (object instanceof JSONObject){
                //JSONObject
            }
            if (object instanceof JSONArray){
                //JSONArray
            }
        }
catch (com.alibaba.fastjson.JSONException e){ //非JSON字符串 }

2.org.json.JSON

直接使用JSON庫做解析的情況不多,但是這裏也稍微寫一下

log.info(JSON.parse(jsonStr).getClass().getName());
try {
    Object json = new JSONTokener(jsonStr).nextValue();
   log.info( json.getClass().toString());
//            json.toString();
if(json instanceof JSONObject){ log.info("is JSONObject"); JSONObject jsonObject = (JSONObject)json; //further actions on jsonObjects //... }else if (json instanceof JSONArray){ log.info("is JSONArray"); JSONArray jsonArray = (JSONArray)json;
//further actions on jsonArray //... } }catch (Exception e){ e.printStackTrace(); }

3.GSON,也是蠻強大的一個庫,沒有依賴包,只是在反射到Map的使用上有點麻煩。

GSON裏面最有意思的就是JsonPrimitive,原始JSON。

先給代碼

String str = "";
JsonParser jsonParser = new JsonParser();
try{
    JsonElement jsonElement = jsonParser.parse(str);
    log.info("jsonElement "+jsonElement.getClass().getName());
    if (jsonElement.isJsonObject()){
        //JsonObject
        log.info(jsonElement.getAsJsonObject().get("aa").getAsString());
    }
    if (jsonElement.isJsonArray()){
        //JsonArray
        log.info(jsonElement.getAsJsonArray().get(0).getAsJsonObject().get("aa").getAsString());
    }
    if (jsonElement.isJsonNull()){
        //空字符串
        log.info(jsonElement.getAsString());
    }
    if (jsonElement.isJsonPrimitive()){
        log.info(jsonElement.getAsString());
    }
}catch (Exception e){
    //非法
//            e.printStackTrace();
    log.info("非法 "+e.getMessage());
}

可知,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 = jsonParser.parse(str);
log.info(jsonElement.getAsJsonObject().get("aa").getAsString());
str = "{\"aa\":true}";
jsonElement = jsonParser.parse(str);
jsonElement.getAsJsonObject().get("aa").getAsBoolean();
str = "{\"aa\":1.2}";
jsonElement.getAsJsonObject().get("aa").getAsBigDecimal();

所以Gson還有一個好處就是自帶轉換為java常規類型。

Fastjson, Gson, org.json.JSON三者對於JSONObject及JSONArray的判斷