mirror of
https://github.com/stleary/JSON-java.git
synced 2025-08-02 11:05:28 -04:00
commit
82432f0245
@ -1785,46 +1785,77 @@ public class JSONObject {
|
||||
populateMap(bean, Collections.newSetFromMap(new IdentityHashMap<Object, Boolean>()), jsonParserConfiguration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a bean into a json object
|
||||
* @param bean object tobe converted
|
||||
* @param objectsRecord set of all objects for this method
|
||||
* @param jsonParserConfiguration json parser settings
|
||||
*/
|
||||
private void populateMap(Object bean, Set<Object> objectsRecord, JSONParserConfiguration jsonParserConfiguration) {
|
||||
Class<?> klass = bean.getClass();
|
||||
|
||||
// If klass is a System class then set includeSuperClass to false.
|
||||
|
||||
boolean includeSuperClass = klass.getClassLoader() != null;
|
||||
|
||||
Method[] methods = includeSuperClass ? klass.getMethods() : klass.getDeclaredMethods();
|
||||
Method[] methods = getMethods(klass);
|
||||
for (final Method method : methods) {
|
||||
if (isValidMethod(method)) {
|
||||
final String key = getKeyNameFromMethod(method);
|
||||
if (key != null && !key.isEmpty()) {
|
||||
try {
|
||||
final Object result = method.invoke(bean);
|
||||
if (result != null || jsonParserConfiguration.isUseNativeNulls()) {
|
||||
// check cyclic dependency and throw error if needed
|
||||
// the wrap and populateMap combination method is
|
||||
// itself DFS recursive
|
||||
if (objectsRecord.contains(result)) {
|
||||
throw recursivelyDefinedObjectException(key);
|
||||
}
|
||||
|
||||
objectsRecord.add(result);
|
||||
|
||||
testValidity(result);
|
||||
this.map.put(key, wrap(result, objectsRecord));
|
||||
|
||||
objectsRecord.remove(result);
|
||||
|
||||
closeClosable(result);
|
||||
}
|
||||
} catch (IllegalAccessException ignore) {
|
||||
} catch (IllegalArgumentException ignore) {
|
||||
} catch (InvocationTargetException ignore) {
|
||||
}
|
||||
processMethod(bean, objectsRecord, jsonParserConfiguration, method, key);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes method into json object entry if appropriate
|
||||
* @param bean object being processed (owns the method)
|
||||
* @param objectsRecord set of all objects for this method
|
||||
* @param jsonParserConfiguration json parser settings
|
||||
* @param method method being processed
|
||||
* @param key name of the method
|
||||
*/
|
||||
private void processMethod(Object bean, Set<Object> objectsRecord, JSONParserConfiguration jsonParserConfiguration,
|
||||
Method method, String key) {
|
||||
try {
|
||||
final Object result = method.invoke(bean);
|
||||
if (result != null || jsonParserConfiguration.isUseNativeNulls()) {
|
||||
// check cyclic dependency and throw error if needed
|
||||
// the wrap and populateMap combination method is
|
||||
// itself DFS recursive
|
||||
if (objectsRecord.contains(result)) {
|
||||
throw recursivelyDefinedObjectException(key);
|
||||
}
|
||||
|
||||
objectsRecord.add(result);
|
||||
|
||||
testValidity(result);
|
||||
this.map.put(key, wrap(result, objectsRecord));
|
||||
|
||||
objectsRecord.remove(result);
|
||||
|
||||
closeClosable(result);
|
||||
}
|
||||
} catch (IllegalAccessException ignore) {
|
||||
// ignore exception
|
||||
} catch (IllegalArgumentException ignore) {
|
||||
// ignore exception
|
||||
} catch (InvocationTargetException ignore) {
|
||||
// ignore exception
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This is a convenience method to simplify populate maps
|
||||
* @param klass the name of the object being checked
|
||||
* @return methods of klass
|
||||
*/
|
||||
private static Method[] getMethods(Class<?> klass) {
|
||||
boolean includeSuperClass = klass.getClassLoader() != null;
|
||||
|
||||
return includeSuperClass ? klass.getMethods() : klass.getDeclaredMethods();
|
||||
}
|
||||
|
||||
private static boolean isValidMethodName(String name) {
|
||||
return !"getClass".equals(name) && !"getDeclaringClass".equals(name);
|
||||
}
|
||||
|
@ -4000,19 +4000,24 @@ public class JSONObjectTest {
|
||||
@Test
|
||||
public void test_strictModeWithMisCasedBooleanOrNullValue(){
|
||||
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration().withStrictMode();
|
||||
|
||||
try{
|
||||
JSONObject j1 = new JSONObject("{\"a\":True}", jsonParserConfiguration);
|
||||
new JSONObject("{\"a\":True}", jsonParserConfiguration);
|
||||
fail("Expected an exception");
|
||||
} catch (JSONException e) { }
|
||||
} catch (JSONException e) {
|
||||
// No action, expected outcome
|
||||
}
|
||||
try{
|
||||
JSONObject j2 = new JSONObject("{\"a\":TRUE}", jsonParserConfiguration);
|
||||
new JSONObject("{\"a\":TRUE}", jsonParserConfiguration);
|
||||
fail("Expected an exception");
|
||||
} catch (JSONException e) { }
|
||||
} catch (JSONException e) {
|
||||
// No action, expected outcome
|
||||
}
|
||||
try{
|
||||
JSONObject j2 = new JSONObject("{\"a\":nUlL}", jsonParserConfiguration);
|
||||
new JSONObject("{\"a\":nUlL}", jsonParserConfiguration);
|
||||
fail("Expected an exception");
|
||||
} catch (JSONException e) { }
|
||||
} catch (JSONException e) {
|
||||
// No action, expected outcome
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -4021,17 +4026,23 @@ public class JSONObjectTest {
|
||||
|
||||
// Parsing the following objects should fail
|
||||
try{
|
||||
JSONObject j3 = new JSONObject("{true : 3}", jsonParserConfiguration);
|
||||
new JSONObject("{true : 3}", jsonParserConfiguration);
|
||||
fail("Expected an exception");
|
||||
} catch (JSONException e) { }
|
||||
} catch (JSONException e) {
|
||||
// No action, expected outcome
|
||||
}
|
||||
try{
|
||||
JSONObject j4 = new JSONObject("{TRUE : 3}", jsonParserConfiguration);
|
||||
new JSONObject("{TRUE : 3}", jsonParserConfiguration);
|
||||
fail("Expected an exception");
|
||||
} catch (JSONException e) { }
|
||||
} catch (JSONException e) {
|
||||
// No action, expected outcome
|
||||
}
|
||||
try{
|
||||
JSONObject j5 = new JSONObject("{1 : 3}", jsonParserConfiguration);
|
||||
new JSONObject("{1 : 3}", jsonParserConfiguration);
|
||||
fail("Expected an exception");
|
||||
} catch (JSONException e) { }
|
||||
} catch (JSONException e) {
|
||||
// No action, expected outcome
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user