diff --git a/src/main/java/org/json/JSONArray.java b/src/main/java/org/json/JSONArray.java index 787e12435..3082974a4 100644 --- a/src/main/java/org/json/JSONArray.java +++ b/src/main/java/org/json/JSONArray.java @@ -173,9 +173,7 @@ public JSONArray(Collection collection) { this.myArrayList = new ArrayList(); } else { this.myArrayList = new ArrayList(collection.size()); - for (Object o: collection){ - this.myArrayList.add(JSONObject.wrap(o)); - } + this.addAll(collection); } } @@ -193,16 +191,7 @@ public JSONArray(Collection collection) { */ public JSONArray(Object array) throws JSONException { this(); - if (array.getClass().isArray()) { - int length = Array.getLength(array); - this.myArrayList.ensureCapacity(length); - for (int i = 0; i < length; i += 1) { - this.put(JSONObject.wrap(Array.get(array, i))); - } - } else { - throw new JSONException( - "JSONArray initial value should be a string or collection or array."); - } + this.addAll(array); } /** @@ -1174,6 +1163,36 @@ public JSONArray put(int index, Object value) throws JSONException { } return this.put(value); } + + /** + * Put or replace a collection's elements in the JSONArray. + * + * @param collection + * A Collection. + * @return this. + */ + public JSONArray putAll(Collection collection) { + this.addAll(collection); + return this; + } + + /** + * Put or replace an array's elements in the JSONArray. + * + * @param array + * Array. If the parameter passed is null, or not an array, an + * exception will be thrown. + * @return this. + * + * @throws JSONException + * If not an array or if an array value is non-finite number. + * @throws NullPointerException + * Thrown if the array parameter is null. + */ + public JSONArray putAll(Object array) throws JSONException { + this.addAll(array); + return this; + } /** * Creates a JSONPointer using an initialization string and tries to @@ -1500,6 +1519,45 @@ public List toList() { public boolean isEmpty() { return this.myArrayList.isEmpty(); } + + + /** + * Add a collection's elements to the JSONArray. + * + * @param collection + * A Collection. + */ + private void addAll(Collection collection) { + this.myArrayList.ensureCapacity(this.myArrayList.size() + collection.size()); + for (Object o: collection){ + this.myArrayList.add(JSONObject.wrap(o)); + } + } + + /** + * Add an array's elements to the JSONArray. + * + * @param array + * Array. If the parameter passed is null, or not an array, an + * exception will be thrown. + * + * @throws JSONException + * If not an array or if an array value is non-finite number. + * @throws NullPointerException + * Thrown if the array parameter is null. + */ + private void addAll(Object array) throws JSONException { + if (array.getClass().isArray()) { + int length = Array.getLength(array); + this.myArrayList.ensureCapacity(this.myArrayList.size() + length); + for (int i = 0; i < length; i += 1) { + this.put(JSONObject.wrap(Array.get(array, i))); + } + } else { + throw new JSONException( + "JSONArray initial value should be a string or collection or array."); + } + } /** * Create a new JSONException in a common format for incorrect conversions. diff --git a/src/test/java/org/json/junit/JSONArrayTest.java b/src/test/java/org/json/junit/JSONArrayTest.java index eda3c06bd..f11b953e5 100644 --- a/src/test/java/org/json/junit/JSONArrayTest.java +++ b/src/test/java/org/json/junit/JSONArrayTest.java @@ -225,6 +225,44 @@ public void verifyConstructor() { expected.similar(jaObj)); } + /** + * Tests consecutive calls to putAll with array and collection. + */ + @Test + public void verifyPutAll() { + final JSONArray jsonArray = new JSONArray(); + + // array + int[] myInts = { 1, 2, 3, 4, 5 }; + jsonArray.putAll(myInts); + + assertEquals("int arrays lengths should be equal", + jsonArray.length(), + myInts.length); + + for (int i = 0; i < myInts.length; i++) { + assertEquals("int arrays elements should be equal", + myInts[i], + jsonArray.getInt(i)); + } + + // collection + List myList = Arrays.asList("one", "two", "three", "four", "five"); + jsonArray.putAll(myList); + + int len = myInts.length + myList.size(); + + assertEquals("arrays lengths should be equal", + jsonArray.length(), + len); + + for (int i = 0; i < myList.size(); i++) { + assertEquals("collection elements should be equal", + myList.get(i), + jsonArray.getString(myInts.length + i)); + } + } + /** * Verifies that the put Collection has backwards compatibility with RAW types pre-java5. */