1
0
Fork 0
mirror of https://github.com/ethauvin/JSON-java.git synced 2025-06-17 07:50:52 -07:00

Merge pull request #140 from douglascrockford/enum-support

Enum support
This commit is contained in:
Sean Leary 2015-07-28 19:33:29 -05:00
commit ce2de45f64
2 changed files with 139 additions and 2 deletions

View file

@ -76,7 +76,7 @@ import java.util.Map;
* </ul> * </ul>
* *
* @author JSON.org * @author JSON.org
* @version 2015-07-06 * @version 2015-07-22
*/ */
public class JSONArray implements Iterable<Object> { public class JSONArray implements Iterable<Object> {
@ -247,6 +247,31 @@ public class JSONArray implements Iterable<Object> {
} }
} }
/**
* 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 at the index location
* @throws JSONException
* if the key is not found or if the value cannot be converted
* to an enum.
*/
public <E extends Enum<E>> E getEnum(Class<E> 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. * Get the BigDecimal value associated with an index.
* *
@ -531,6 +556,50 @@ public class JSONArray implements Iterable<Object> {
} }
} }
/**
* 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 at the index location or null if not found
*/
public <E extends Enum<E>> E optEnum(Class<E> 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 at the index location or defaultValue if
* the value is not found or cannot be assigned to clazz
*/
public <E extends Enum<E>> E optEnum(Class<E> 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 * Get the optional BigInteger value associated with an index. The
* defaultValue is returned if there is no value for the index, or if the * defaultValue is returned if there is no value for the index, or if the

View file

@ -92,7 +92,7 @@ import java.util.Set;
* </ul> * </ul>
* *
* @author JSON.org * @author JSON.org
* @version 2015-07-06 * @version 2015-07-22
*/ */
public class JSONObject { public class JSONObject {
/** /**
@ -479,6 +479,31 @@ public class JSONObject {
return object; 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 associated with the key
* @throws JSONException
* if the key is not found or if the value cannot be converted
* to an enum.
*/
public <E extends Enum<E>> E getEnum(Class<E> 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. * Get the boolean value associated with a key.
* *
@ -844,6 +869,49 @@ public class JSONObject {
return key == null ? null : this.map.get(key); 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 associated with the key or null if not found
*/
public <E extends Enum<E>> E optEnum(Class<E> 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 associated with the key or defaultValue
* if the value is not found or cannot be assigned to clazz
*/
public <E extends Enum<E>> E optEnum(Class<E> 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 * 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". * is no such key, or if the value is not Boolean.TRUE or the String "true".