The putAll method on JSONArray does not call JSONObject.wrap for items added. This can result in a mixed JSONArray where some items are wrapped in JSONObjects and others are not, depending on how the array was initially constructed.
To maintain a consistent structure, avoid mixing the JSONArray(Object[]) constructor with putAll(Object[]). Instead, use one of the following patterns:
Option 1: Use putAll for all additions
SomeBean[] myArr = new SomeBean[]{ new SomeBean(1), new SomeBean(2) };
JSONArray jArr = new JSONArray();
// these will not be wrapped
jArr.putAll(myArr);
// these will not be wrapped
jArr.putAll(new SomeBean[]{ new SomeBean(3), new SomeBean(4) });
Option 2: Wrap all additions in JSONArray first
SomeBean[] myArr = new SomeBean[]{ new SomeBean(1), new SomeBean(2) };
// these will be wrapped
JSONArray jArr = new JSONArray(myArr);
// these will be wrapped
jArr.putAll(new JSONArray(new SomeBean[]{ new SomeBean(3), new SomeBean(4) }));
SomeBean[] myArr = new SomeBean[]{ new SomeBean(1), new SomeBean(2) };
// these will be wrapped
JSONArray jArr = new JSONArray(myArr);
// these will be wrapped
jArr.putAll(new JSONArray(new SomeBean[]{ new SomeBean(3), new SomeBean(4) }));