diff --git a/JacksonReplacement/JsonAnySetter.java b/JacksonReplacement/JsonAnySetter.java new file mode 100644 index 000000000..2bee382de --- /dev/null +++ b/JacksonReplacement/JsonAnySetter.java @@ -0,0 +1,12 @@ +package com.darylbeattie.movies.util; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(value=ElementType.METHOD) +@Retention(value=RetentionPolicy.RUNTIME) +public @interface JsonAnySetter { + +} diff --git a/JacksonReplacement/JsonProperty.java b/JacksonReplacement/JsonProperty.java new file mode 100644 index 000000000..77be4f498 --- /dev/null +++ b/JacksonReplacement/JsonProperty.java @@ -0,0 +1,12 @@ +package com.darylbeattie.movies.util; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +public @interface JsonProperty { + String value() default ""; +} diff --git a/JacksonReplacement/JsonRootName.java b/JacksonReplacement/JsonRootName.java new file mode 100644 index 000000000..4f5450dfa --- /dev/null +++ b/JacksonReplacement/JsonRootName.java @@ -0,0 +1,12 @@ +package com.darylbeattie.movies.util; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface JsonRootName { + String value() default ""; +} diff --git a/JacksonReplacement/ObjectMapper.java b/JacksonReplacement/ObjectMapper.java new file mode 100644 index 000000000..2150c721d --- /dev/null +++ b/JacksonReplacement/ObjectMapper.java @@ -0,0 +1,69 @@ +package com.darylbeattie.movies.util; + +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONObject; + +public class ObjectMapper { + + /** + * This takes a JSON string and creates (and populates) an object of the given class + * with the data from that JSON string. It mimics the method signature of the jackson + * JSON API, so that we don't have to import the jackson library into this application. + * + * @param jsonString The JSON string to parse. + * @param objClass The class of object we want to create. + * @return The instantiation of that class, populated with data from the JSON object. + * @throws IOException If there was any kind of issue. + */ + public T readValue(String jsonString, Class objClass) throws IOException { + try { + return readValue(new JSONObject(jsonString), objClass); + } + catch (IOException ioe) { + throw ioe; + } + catch (Exception e) { + e.printStackTrace(); + throw new IOException(e); + } + } + + @SuppressWarnings("unchecked") + public T readValue(JSONObject json, Class objClass) throws IOException { + try { + //TODO Iterate through json object values and call the JsonAnySetter method on the unknown ones. + T obj = objClass.newInstance(); + for (Field f : objClass.getFields()) { + Annotation a = f.getAnnotation(JsonProperty.class); + if (List.class.equals(f.getType()) && (json.optJSONArray(((JsonProperty) a).value()) != null)) { // It's a list. + JSONArray jsonArray = json.optJSONArray(((JsonProperty) a).value()); + ParameterizedType listType = (ParameterizedType) f.getGenericType(); + Class subObj = (Class) listType.getActualTypeArguments()[0]; + List subObjList = ((Class>) f.getType()).newInstance(); + for (int i = 0; i < jsonArray.length(); i++) { + subObjList.add((R) readValue(jsonArray.getJSONObject(i), subObj)); + } + f.set(obj, subObjList); + } + else if (a != null) { + f.set(obj, json.opt(((JsonProperty) a).value())); + } + } + return obj; + } + catch (IOException ioe) { + throw ioe; + } + catch (Exception e) { + e.printStackTrace(); + throw new IOException(e); + } + } + +} \ No newline at end of file diff --git a/JacksonReplacement/README.md b/JacksonReplacement/README.md new file mode 100644 index 000000000..71bdb8a7d --- /dev/null +++ b/JacksonReplacement/README.md @@ -0,0 +1,6 @@ +Jackson Library Replacement +=========================== + +These files are provided by Darren Beattie as an example of how to replace the Jackson libraries with native libraries inside Android. + +They are provided without warrantee and if you modify them or find them useful, please let me know.