From ca3001629a398267fd312ee588cf7408bfe177ef Mon Sep 17 00:00:00 2001 From: stleary Date: Wed, 22 Jul 2015 20:11:07 -0500 Subject: [PATCH] latest --- JSONArray.java | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ JSONObject.java | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) diff --git a/JSONArray.java b/JSONArray.java index b1334db..5806917 100644 --- a/JSONArray.java +++ b/JSONArray.java @@ -247,6 +247,31 @@ public class JSONArray implements Iterable { } } + /** + * Get the enum value associated with an index. + * + * @param clazz + * The type of enum to retrieve. + * @param index + * The index must be between 0 and length() - 1. + * @return The enum value. + * @throws JSONException + * if the key is not found or if the value cannot be converted + * to an enum. + */ + public > E getEnum(Class clazz, int index) throws JSONException { + E val = optEnum(clazz, index); + if(val==null) { + // JSONException should really take a throwable argument. + // If it did, I would re-implement this with the Enum.valueOf + // method and place any thrown exception in the JSONException + throw new JSONException("JSONObject[" + JSONObject.quote(Integer.toString(index)) + + "] is not an enum of type " + JSONObject.quote(clazz.getSimpleName()) + + "."); + } + return val; + } + /** * Get the BigDecimal value associated with an index. * @@ -531,6 +556,50 @@ public class JSONArray implements Iterable { } } + /** + * Get the enum value associated with a key. + * + * @param clazz + * The type of enum to retrieve. + * @param index + * The index must be between 0 and length() - 1. + * @return The enum value or null if not found + */ + public > E optEnum(Class clazz, int index) { + return this.optEnum(clazz, index, null); + } + + /** + * Get the enum value associated with a key. + * + * @param clazz + * The type of enum to retrieve. + * @param index + * The index must be between 0 and length() - 1. + * @param defaultValue + * The default in case the value is not found + * @return The enum value or defaultValue if the value is not found or + * cannot be assigned to clazz + */ + public > E optEnum(Class clazz, int index, E defaultValue) { + try { + Object val = this.opt(index); + if (JSONObject.NULL.equals(val)) { + return defaultValue; + } + if (clazz.isAssignableFrom(val.getClass())) { + // we just checked it! + @SuppressWarnings("unchecked") + E myE = (E) val; + return myE; + } + return Enum.valueOf(clazz, val.toString()); + } catch (IllegalArgumentException | NullPointerException e) { + return defaultValue; + } + } + + /** * Get the optional BigInteger value associated with an index. The * defaultValue is returned if there is no value for the index, or if the diff --git a/JSONObject.java b/JSONObject.java index 34d5c6c..2bf733b 100755 --- a/JSONObject.java +++ b/JSONObject.java @@ -479,6 +479,31 @@ public class JSONObject { return object; } + /** + * Get the enum value associated with a key. + * + * @param clazz + * The type of enum to retrieve. + * @param key + * A key string. + * @return The enum value. + * @throws JSONException + * if the key is not found or if the value cannot be converted + * to an enum. + */ + public > E getEnum(Class clazz, String key) throws JSONException { + E val = optEnum(clazz, key); + if(val==null) { + // JSONException should really take a throwable argument. + // If it did, I would re-implement this with the Enum.valueOf + // method and place any thrown exception in the JSONException + throw new JSONException("JSONObject[" + quote(key) + + "] is not an enum of type " + quote(clazz.getSimpleName()) + + "."); + } + return val; + } + /** * Get the boolean value associated with a key. * @@ -844,6 +869,49 @@ public class JSONObject { return key == null ? null : this.map.get(key); } + /** + * Get the enum value associated with a key. + * + * @param clazz + * The type of enum to retrieve. + * @param key + * A key string. + * @return The enum value or null if not found + */ + public > E optEnum(Class clazz, String key) { + return this.optEnum(clazz, key, null); + } + + /** + * Get the enum value associated with a key. + * + * @param clazz + * The type of enum to retrieve. + * @param key + * A key string. + * @param defaultValue + * The default in case the value is not found + * @return The enum value or defaultValue if the value is not found or + * cannot be assigned to clazz + */ + public > E optEnum(Class clazz, String key, E defaultValue) { + try { + Object val = this.opt(key); + if (NULL.equals(val)) { + return defaultValue; + } + if (clazz.isAssignableFrom(val.getClass())) { + // we just checked it! + @SuppressWarnings("unchecked") + E myE = (E) val; + return myE; + } + return Enum.valueOf(clazz, val.toString()); + } catch (IllegalArgumentException | NullPointerException e) { + return defaultValue; + } + } + /** * Get an optional boolean associated with a key. It returns false if there * is no such key, or if the value is not Boolean.TRUE or the String "true".