最近在使用Gson解析數據時遇到了一個小問題,就是當JSON數據為空時,Gson會返回一個空對象而不是拋出異常。
Gson gson = new Gson(); String emptyJson = "{}"; EmptyClass emptyClass = gson.fromJson(emptyJson, EmptyClass.class); assert emptyClass != null; // Passes, but should fail
這種情況下,我實際上期望拋出一個異常,提示我JSON數據為空。但是,Gson返回了一個空對象,導致我的應用程序無法正常工作。
解決這個問題的方法很簡單,只需要為Gson配置一個自定義的反序列化器即可:
Gson gson = new GsonBuilder() .registerTypeAdapter(EmptyClass.class, new JsonDeserializer<EmptyClass>() { @Override public EmptyClass deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { if (jsonElement.isJsonArray() || jsonElement.isJsonObject()) { return new Gson().fromJson(jsonElement, type); } else { throw new JsonParseException("Empty JSON object"); } } }) .create();
在這段代碼中,我們注冊了一個自定義的反序列化器,它會檢查JSON元素是否是一個JSON數組或JSON對象。如果是,它將調用Gson進行反序列化并返回結果;否則,它將拋出一個JsonParseException異常。
現在,我們重新運行之前的測試:
Gson gson = new GsonBuilder() .registerTypeAdapter(EmptyClass.class, new JsonDeserializer<EmptyClass>() { @Override public EmptyClass deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { if (jsonElement.isJsonArray() || jsonElement.isJsonObject()) { return new Gson().fromJson(jsonElement, type); } else { throw new JsonParseException("Empty JSON object"); } } }) .create(); String emptyJson = "{}"; EmptyClass emptyClass = gson.fromJson(emptyJson, EmptyClass.class);
這次,我們期望拋出一個JsonParseException異常,因為實際上JSON數據為空。測試現在通過了,并且我們的應用程序也可以處理空JSON對象了。