diff options
author | Peter Wu <peter@lekensteyn.nl> | 2014-05-08 19:00:44 +0200 |
---|---|---|
committer | Peter Wu <peter@lekensteyn.nl> | 2014-05-08 19:00:44 +0200 |
commit | 5f892ac1e0fe6a21a00808cfb0afae2a2c2071dc (patch) | |
tree | 383da575535e24c3865ea793e9b00f30bc457661 /src/data/ValidatingJsonDeserializer.java | |
parent | 4ba04e1a6b2ca94a124f63c6f7a6033b7f17344e (diff) | |
download | Datafiller-5f892ac1e0fe6a21a00808cfb0afae2a2c2071dc.tar.gz |
Add json containers for Tweet and User objects
Diffstat (limited to 'src/data/ValidatingJsonDeserializer.java')
-rw-r--r-- | src/data/ValidatingJsonDeserializer.java | 72 |
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 { + } +} |