successful test

This commit is contained in:
Zach 2021-11-17 19:35:53 -06:00
parent 4565bddcbb
commit 1ffcf3915c
3 changed files with 33 additions and 7 deletions

View File

@ -366,6 +366,11 @@ public class JSONObject {
this.populateMap(bean); this.populateMap(bean);
} }
private JSONObject(Object bean, Set<Object> objectsRecord) {
this();
this.populateMap(bean, objectsRecord);
}
/** /**
* Construct a JSONObject from an Object, using reflection to find the * Construct a JSONObject from an Object, using reflection to find the
* public members. The resulting JSONObject's keys will be the strings from * public members. The resulting JSONObject's keys will be the strings from
@ -1511,11 +1516,6 @@ public class JSONObject {
return NULL.equals(object) ? defaultValue : object.toString(); return NULL.equals(object) ? defaultValue : object.toString();
} }
// Set to store the current seen objects in the recursive reaversal
// If the next value to be added to this set is a duplicate, a cycle
// is found
private final Set<Object> objectsRecord = new HashSet<Object>();
/** /**
* Populates the internal map of the JSONObject with the bean properties. The * Populates the internal map of the JSONObject with the bean properties. The
* bean can not be recursive. * bean can not be recursive.
@ -1526,6 +1526,10 @@ public class JSONObject {
* the bean * the bean
*/ */
private void populateMap(Object bean) { private void populateMap(Object bean) {
populateMap(bean, new HashSet<Object>());
}
private void populateMap(Object bean, Set<Object> objectsRecord) {
Class<?> klass = bean.getClass(); Class<?> klass = bean.getClass();
// If klass is a System class then set includeSuperClass to false. // If klass is a System class then set includeSuperClass to false.
@ -1555,7 +1559,7 @@ public class JSONObject {
objectsRecord.add(result); objectsRecord.add(result);
this.map.put(key, wrap(result)); this.map.put(key, wrap(result, objectsRecord));
objectsRecord.remove(result); objectsRecord.remove(result);
@ -2449,6 +2453,10 @@ public class JSONObject {
* @return The wrapped value * @return The wrapped value
*/ */
public static Object wrap(Object object) { public static Object wrap(Object object) {
return wrap(object, null);
}
private static Object wrap(Object object, Set<Object> objectsRecord) {
try { try {
if (NULL.equals(object)) { if (NULL.equals(object)) {
return NULL; return NULL;
@ -2483,7 +2491,15 @@ public class JSONObject {
|| object.getClass().getClassLoader() == null) { || object.getClass().getClassLoader() == null) {
return object.toString(); return object.toString();
} }
return new JSONObject(object); if (objectsRecord != null) {
return new JSONObject(object, objectsRecord);
}
else {
return new JSONObject(object);
}
}
catch (JSONException exception) {
throw exception;
} catch (Exception exception) { } catch (Exception exception) {
return null; return null;
} }

View File

@ -73,6 +73,7 @@ import org.json.junit.data.MyJsonString;
import org.json.junit.data.MyNumber; import org.json.junit.data.MyNumber;
import org.json.junit.data.MyNumberContainer; import org.json.junit.data.MyNumberContainer;
import org.json.junit.data.MyPublicClass; import org.json.junit.data.MyPublicClass;
import org.json.junit.data.RecursiveBean;
import org.json.junit.data.Singleton; import org.json.junit.data.Singleton;
import org.json.junit.data.SingletonEnum; import org.json.junit.data.SingletonEnum;
import org.json.junit.data.WeirdList; import org.json.junit.data.WeirdList;
@ -3218,6 +3219,14 @@ public class JSONObjectTest {
jsonObject.put(null, new Object()); jsonObject.put(null, new Object());
fail("Expected an exception"); fail("Expected an exception");
} }
@Test(expected=JSONException.class)
public void testSimpleRecursiveObject() {
RecursiveBean ObjA = new RecursiveBean("ObjA");
RecursiveBean ObjB = new RecursiveBean("ObjB", ObjA);
ObjA.setRef(ObjB);
JSONObject jsonObject = new JSONObject(ObjA);
fail("Expected an exception");
}
@Test @Test
public void testIssue548ObjectWithEmptyJsonArray() { public void testIssue548ObjectWithEmptyJsonArray() {

View File

@ -10,6 +10,7 @@ public class RecursiveBean {
private Object reference; private Object reference;
public String getName() { return name; } public String getName() { return name; }
public Object getRef() {return reference;} public Object getRef() {return reference;}
public void setRef(Object refObj) {reference = refObj;}
public RecursiveBean(String name) { public RecursiveBean(String name) {
this.name = name; this.name = name;