From e4d8d30fca3bc621e0f5ec6eba6117b510621c6f Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Sat, 10 May 2014 01:06:28 +0200 Subject: Add validator debugger where the wrong type is returned --- src/data/DebuggingJsonDeserializer.java | 41 +++++++++++++++++++++++++++ src/data/ValidatingJsonDeserializer.java | 2 +- src/io/TweetReader.java | 14 ++++++++- test/data/ValidatingJsonDeserializerTest.java | 10 +++++++ 4 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/data/DebuggingJsonDeserializer.java diff --git a/src/data/DebuggingJsonDeserializer.java b/src/data/DebuggingJsonDeserializer.java new file mode 100644 index 0000000..1b00d4d --- /dev/null +++ b/src/data/DebuggingJsonDeserializer.java @@ -0,0 +1,41 @@ +package data; + +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import java.lang.reflect.Type; + +/** + * Validates the deserialization of a JSON string. The main motivation of this + * class is to print the property name of an object that throws an + * IllegalStateException because a string was expected, but a different type got + * returned. + * + * @author Peter Wu + */ +public class DebuggingJsonDeserializer extends ValidatingJsonDeserializer { + + private final Class overriddenClass; + + private DebuggingJsonDeserializer(Class overriddenClass) { + this.overriddenClass = overriddenClass; + } + + @Override + public Object deserialize(JsonElement je, Type type, + JsonDeserializationContext jdc) throws JsonParseException { + checkObject("", je, overriddenClass); + return null; + } + + public static void tryValidate(String json, Class cls) { + new GsonBuilder() + .registerTypeAdapter(Dummy.class, new DebuggingJsonDeserializer(cls)) + .create() + .fromJson(json, Dummy.class); + } + + private class Dummy { + } +} diff --git a/src/data/ValidatingJsonDeserializer.java b/src/data/ValidatingJsonDeserializer.java index c168821..f44b681 100644 --- a/src/data/ValidatingJsonDeserializer.java +++ b/src/data/ValidatingJsonDeserializer.java @@ -30,7 +30,7 @@ public class ValidatingJsonDeserializer implements JsonDeserializer { return obj; } - private void checkObject(String path, JsonElement je, Class type) { + void checkObject(String path, JsonElement je, Class type) { JsonObject jsonObj = je.getAsJsonObject(); for (Field f : type.getDeclaredFields()) { JsonElement val = jsonObj.get(f.getName()); diff --git a/src/io/TweetReader.java b/src/io/TweetReader.java index bf89a2c..f67daf8 100644 --- a/src/io/TweetReader.java +++ b/src/io/TweetReader.java @@ -2,7 +2,9 @@ package io; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonParseException; import com.google.gson.JsonSyntaxException; +import data.DebuggingJsonDeserializer; import data.Tweet; import data.ValidatingJsonDeserializer; import java.io.BufferedReader; @@ -40,7 +42,7 @@ public class TweetReader implements ITweetReader { try { tweet = gson.fromJson(line, Tweet.class); } catch (JsonSyntaxException ex) { - // TODO: handle something? + debugTweet(line, ex); throw ex; } } @@ -54,4 +56,14 @@ public class TweetReader implements ITweetReader { } catch (IOException ex) { } } + + private void debugTweet(String line, JsonSyntaxException ex) { + try { + System.err.println("Faulty line: " + line); + DebuggingJsonDeserializer.tryValidate(line, Tweet.class); + System.err.println("No error occured, how strange?"); + } catch (JsonParseException jse) { + System.err.println("The error was: " + jse); + } + } } diff --git a/test/data/ValidatingJsonDeserializerTest.java b/test/data/ValidatingJsonDeserializerTest.java index 2d3ffd1..a1f9884 100644 --- a/test/data/ValidatingJsonDeserializerTest.java +++ b/test/data/ValidatingJsonDeserializerTest.java @@ -534,4 +534,14 @@ public class ValidatingJsonDeserializerTest { tweet.add("place", null); checkTweetPass(tweet); } + + @Test + public void testNotATweetObject() { + try { + DebuggingJsonDeserializer.tryValidate("{}", Tweet.class); + fail("DebuggingJsonDeserializer must also check for type."); + } catch (JsonParseException ex) { + assertEquals("Missing field: id", ex.getMessage()); + } + } } -- cgit v1.2.1