summaryrefslogtreecommitdiff
path: root/src/data/ValidatingJsonDeserializer.java
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2014-05-08 19:00:44 +0200
committerPeter Wu <peter@lekensteyn.nl>2014-05-08 19:00:44 +0200
commit5f892ac1e0fe6a21a00808cfb0afae2a2c2071dc (patch)
tree383da575535e24c3865ea793e9b00f30bc457661 /src/data/ValidatingJsonDeserializer.java
parent4ba04e1a6b2ca94a124f63c6f7a6033b7f17344e (diff)
downloadDatafiller-5f892ac1e0fe6a21a00808cfb0afae2a2c2071dc.tar.gz
Add json containers for Tweet and User objects
Diffstat (limited to 'src/data/ValidatingJsonDeserializer.java')
-rw-r--r--src/data/ValidatingJsonDeserializer.java72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/data/ValidatingJsonDeserializer.java b/src/data/ValidatingJsonDeserializer.java
new file mode 100644
index 0000000..91c1709
--- /dev/null
+++ b/src/data/ValidatingJsonDeserializer.java
@@ -0,0 +1,72 @@
+package data;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.reflect.Field;
+import java.lang.reflect.Type;
+
+/**
+ * JSON deserializer which validates that all fields are present.
+ *
+ * @author Peter Wu.
+ */
+public class ValidatingJsonDeserializer<T> implements JsonDeserializer<T> {
+
+ @Override
+ public T deserialize(JsonElement je, Type type,
+ JsonDeserializationContext jdc) throws JsonParseException {
+ T obj = new Gson().fromJson(je, type);
+ JsonObject jsonObj = je.getAsJsonObject();
+ for (Field f : obj.getClass().getDeclaredFields()) {
+ if (!jsonObj.has(f.getName())) {
+ if (f.getAnnotation(Nullable.class) != null) {
+ // null allowed, skip
+ continue;
+ }
+ throw new JsonParseException("Missing field: " + f.getName());
+ }
+ // TODO: validate type?
+ }
+ return obj;
+ }
+
+ public static GsonBuilder addValidation(GsonBuilder gson, Type type) {
+ GsonBuilder gb = new GsonBuilder();
+ gson.registerTypeAdapter(type, new ValidatingJsonDeserializer());
+ for (Field f : type.getClass().getDeclaredFields()) {
+ Validator v = f.getAnnotation(Validator.class);
+ if (v != null) {
+ addValidation(gson, v.deserializer());
+ }
+ }
+ return gb;
+ }
+
+ /**
+ * Marks a member as object that should be validated too.
+ */
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.FIELD)
+ public @interface Validator {
+
+ Class deserializer() default ValidatingJsonDeserializer.class;
+ }
+
+ /**
+ * Marks a member as nullable, that is, it can be missing from the JSON
+ * object.
+ */
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.FIELD)
+ public @interface Nullable {
+ }
+}