Converting JSONarray to ArrayList

The question:

I am downloading a JSON string and converting it to JSONArray. Im putting it into a listview and need to be able to delete from that listview later, and since JSONArray has no .remove method (Thanks Obama), I am trying to convert it to an arraylist.

here is my JSON (the array.toString()):

[
    {
         "thumb_url":"tb1370913834.jpg",
         "event_id":"15","count":"44",
         "event_tagline":"this is a tagline",
         "event_name":"5th birthday",
         "event_end":"1370919600",
         "event_start":"1370876400"
    }
]

I need to get it into an array and be able to call the strings by their respective keys. Appreciate any help!

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
   for (int i=0;i<jArray.length();i++){ 
    listdata.add(jArray.getString(i));
   } 
} 

Method 2

I’ve done it using Gson (by Google).

Add the following line to your module’s build.gradle:

dependencies {
  // ...
  // Note that `compile` will be deprecated. Use `implementation` instead.
  // See https://stackoverflow.com/a/44409111 for more info
  implementation 'com.google.code.gson:gson:2.8.2'
}

JSON string:

private String jsonString = "[n" +
            "        {n" +
            "                "id": "c200",n" +
            "                "name": "Ravi Tamada",n" +
            "                "email": "[email protected]",n" +
            "                "address": "xx-xx-xxxx,x - street, x - country",n" +
            "                "gender" : "male",n" +
            "                "phone": {n" +
            "                    "mobile": "+91 0000000000",n" +
            "                    "home": "00 000000",n" +
            "                    "office": "00 000000"n" +
            "                }n" +
            "        },n" +
            "        {n" +
            "                "id": "c201",n" +
            "                "name": "Johnny Depp",n" +
            "                "email": "[email protected]",n" +
            "                "address": "xx-xx-xxxx,x - street, x - country",n" +
            "                "gender" : "male",n" +
            "                "phone": {n" +
            "                    "mobile": "+91 0000000000",n" +
            "                    "home": "00 000000",n" +
            "                    "office": "00 000000"n" +
            "                }n" +
            "        },n" +
            "        {n" +
            "                "id": "c202",n" +
            "                "name": "Leonardo Dicaprio",n" +
            "                "email": "[email protected]",n" +
            "                "address": "xx-xx-xxxx,x - street, x - country",n" +
            "                "gender" : "male",n" +
            "                "phone": {n" +
            "                    "mobile": "+91 0000000000",n" +
            "                    "home": "00 000000",n" +
            "                    "office": "00 000000"n" +
            "                }n" +
            "        },n" +
            "        {n" +
            "                "id": "c203",n" +
            "                "name": "John Wayne",n" +
            "                "email": "[email protected]",n" +
            "                "address": "xx-xx-xxxx,x - street, x - country",n" +
            "                "gender" : "male",n" +
            "                "phone": {n" +
            "                    "mobile": "+91 0000000000",n" +
            "                    "home": "00 000000",n" +
            "                    "office": "00 000000"n" +
            "                }n" +
            "        },n" +
            "        {n" +
            "                "id": "c204",n" +
            "                "name": "Angelina Jolie",n" +
            "                "email": "[email protected]",n" +
            "                "address": "xx-xx-xxxx,x - street, x - country",n" +
            "                "gender" : "female",n" +
            "                "phone": {n" +
            "                    "mobile": "+91 0000000000",n" +
            "                    "home": "00 000000",n" +
            "                    "office": "00 000000"n" +
            "                }n" +
            "        },n" +
            "        {n" +
            "                "id": "c205",n" +
            "                "name": "Dido",n" +
            "                "email": "[email protected]",n" +
            "                "address": "xx-xx-xxxx,x - street, x - country",n" +
            "                "gender" : "female",n" +
            "                "phone": {n" +
            "                    "mobile": "+91 0000000000",n" +
            "                    "home": "00 000000",n" +
            "                    "office": "00 000000"n" +
            "                }n" +
            "        },n" +
            "        {n" +
            "                "id": "c206",n" +
            "                "name": "Adele",n" +
            "                "email": "[email protected]",n" +
            "                "address": "xx-xx-xxxx,x - street, x - country",n" +
            "                "gender" : "female",n" +
            "                "phone": {n" +
            "                    "mobile": "+91 0000000000",n" +
            "                    "home": "00 000000",n" +
            "                    "office": "00 000000"n" +
            "                }n" +
            "        },n" +
            "        {n" +
            "                "id": "c207",n" +
            "                "name": "Hugh Jackman",n" +
            "                "email": "[email protected]",n" +
            "                "address": "xx-xx-xxxx,x - street, x - country",n" +
            "                "gender" : "male",n" +
            "                "phone": {n" +
            "                    "mobile": "+91 0000000000",n" +
            "                    "home": "00 000000",n" +
            "                    "office": "00 000000"n" +
            "                }n" +
            "        },n" +
            "        {n" +
            "                "id": "c208",n" +
            "                "name": "Will Smith",n" +
            "                "email": "[email protected]",n" +
            "                "address": "xx-xx-xxxx,x - street, x - country",n" +
            "                "gender" : "male",n" +
            "                "phone": {n" +
            "                    "mobile": "+91 0000000000",n" +
            "                    "home": "00 000000",n" +
            "                    "office": "00 000000"n" +
            "                }n" +
            "        },n" +
            "        {n" +
            "                "id": "c209",n" +
            "                "name": "Clint Eastwood",n" +
            "                "email": "[email protected]",n" +
            "                "address": "xx-xx-xxxx,x - street, x - country",n" +
            "                "gender" : "male",n" +
            "                "phone": {n" +
            "                    "mobile": "+91 0000000000",n" +
            "                    "home": "00 000000",n" +
            "                    "office": "00 000000"n" +
            "                }n" +
            "        },n" +
            "        {n" +
            "                "id": "c2010",n" +
            "                "name": "Barack Obama",n" +
            "                "email": "[email protected]",n" +
            "                "address": "xx-xx-xxxx,x - street, x - country",n" +
            "                "gender" : "male",n" +
            "                "phone": {n" +
            "                    "mobile": "+91 0000000000",n" +
            "                    "home": "00 000000",n" +
            "                    "office": "00 000000"n" +
            "                }n" +
            "        },n" +
            "        {n" +
            "                "id": "c2011",n" +
            "                "name": "Kate Winslet",n" +
            "                "email": "[email protected]",n" +
            "                "address": "xx-xx-xxxx,x - street, x - country",n" +
            "                "gender" : "female",n" +
            "                "phone": {n" +
            "                    "mobile": "+91 0000000000",n" +
            "                    "home": "00 000000",n" +
            "                    "office": "00 000000"n" +
            "                }n" +
            "        },n" +
            "        {n" +
            "                "id": "c2012",n" +
            "                "name": "Eminem",n" +
            "                "email": "[email protected]",n" +
            "                "address": "xx-xx-xxxx,x - street, x - country",n" +
            "                "gender" : "male",n" +
            "                "phone": {n" +
            "                    "mobile": "+91 0000000000",n" +
            "                    "home": "00 000000",n" +
            "                    "office": "00 000000"n" +
            "                }n" +
            "        }n" +
            "    ]";

ContactModel.java:

public class ContactModel {
     public String id;
     public String name;
     public String email;
}

Code for converting a JSON string to ArrayList<Model>:

Note: You have to import java.lang.reflect.Type;:

// Top of file
import java.lang.reflect.Type;

// ...

private void parseJSON() {
    Gson gson = new Gson();
    Type type = new TypeToken<List<ContactModel>>(){}.getType();
    List<ContactModel> contactList = gson.fromJson(jsonString, type);
    for (ContactModel contact : contactList){
        Log.i("Contact Details", contact.id + "-" + contact.name + "-" + contact.email);
    }
}

Hope this will help you.

Method 3

I have fast solution. Just create a file ArrayUtil.java

import java.util.ArrayList;
import java.util.Collection;
import org.json.JSONArray;
import org.json.JSONException;

public class ArrayUtil
{
    public static ArrayList<Object> convert(JSONArray jArr)
    {
        ArrayList<Object> list = new ArrayList<Object>();
        try {
            for (int i=0, l=jArr.length(); i<l; i++){
                 list.add(jArr.get(i));
            }
        } catch (JSONException e) {}

        return list;
    }

    public static JSONArray convert(Collection<Object> list)
    {
        return new JSONArray(list);
    }

}

Usage:

ArrayList<Object> list = ArrayUtil.convert(jArray);

or

JSONArray jArr = ArrayUtil.convert(list);

Method 4

try this way
Simply loop through that, building your own array. This code assumes it’s an array of strings, it shouldn’t be hard to modify to suit your particular array structure.

JSONArray jsonArray = new JSONArray(jsonArrayString);
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
    list.add( jsonArray.getString(i) );

Method 5

Instead of converting the JSON string to an ArrayList or even a Map, you can just create a JSONObject itself. This object has the ability to get string values by key, as you want and also to remove objects.

To create a JSONObject from a properly formatted JSON string, you simply call the appropriate constructor.

JSONObject json = new JSONObject(jsonString);

Method 6

In Java 8,

IntStream.range(0,jsonArray.length()).mapToObj(i->jsonArray.getString(i)).collect(Collectors.toList())

Method 7

 JSONArray array = new JSONArray(json);
 List<JSONObject> list = new ArrayList();
 for (int i = 0; i < array.length();list.add(array.getJSONObject(i++)));

Method 8

To make it handy, use POJO.

try like this..

List<YourPojoObject> yourPojos = new ArrayList<YourPojoObject>();

JSONObject jsonObject = new JSONObject(jsonString);
YourPojoObject yourPojo = new YourPojoObject();
yourPojo.setId(jsonObject.getString("idName"));
...
...

yourPojos.add(yourPojo);

Method 9

I have fast solution. Just create a file ArrayUtil.java

ObjectMapper mapper = new ObjectMapper(); 
List<Student> list = Arrays.asList(mapper.readValue(jsonString, Student[].class));

Usage:

ArrayList<Object> list = ArrayUtil.convert(jArray);

or

JSONArray jArr = ArrayUtil.convert(list);

Method 10

if you want to extract data form JSON string array, here is my working code. change parameter as your data.


PoJo class

public class AllAppModel {
    private String appName;
    private String packageName;
    private int uid;
    private boolean isSelected;
    private boolean isSystemApp;
    private boolean isFav;
}

Extract your data using below line of code

try {
    JSONArray jsonArr = new JSONArray("Your json string array");
    List<AllAppModel> lstExtrextData = new ArrayList<>();
    for (int i = 0; i < jsonArr.length(); i++) {
        JSONObject jsonObj = jsonArr.getJSONObject(i);
        AllAppModel data = new AllAppModel();
        data.setAppName(jsonObj.getString("appName"));
        data.setPackageName(jsonObj.getString("packageName"));
        data.setUid(jsonObj.getInt("uid"));
        data.setSelected(jsonObj.getBoolean("isSelected"));
        data.setSystemApp(jsonObj.getBoolean("isSystemApp"));
        data.setFav(jsonObj.getBoolean("isFav"));
        lstExtrextData.add(data);
    }
} catch (JSONException e) {
    e.printStackTrace();
}

it will return you List of PoJo class object.

Method 11

If the Json object consists an array of strings, then there is a way where we need not even use the JSONArray.

if the Json is not in string format, we can convert the json into a string.
Now if Json string is:

String value = "["value1","value2"]";

Then we can use to get the List of String:

List<String> result = new Gson().fromJson(value, List.class);

Method 12

with GSON and Kotlin you just need this:

    val arr = Gson().fromJson(jsonArrayInString, Array<T>::class.java)

Method 13

Using Gson

    List<Student> students = new ArrayList<>();
    JSONArray jsonArray = new JSONArray(stringJsonContainArray);
    for (int i = 0; i < jsonArray.length(); i++) {
        Student student = new Gson().fromJson(jsonArray.get(i).toString(), Student.class);
        students.add(student);
    }
    return students;

Method 14

Just going by the original subject of the thread:

converting jsonarray to list (used jackson jsonarray and object mapper here):

ObjectMapper mapper = new ObjectMapper();
JSONArray array = new JSONArray();
array.put("IND");
array.put("CHN");
List<String> list = mapper.readValue(array.toString(), List.class);

Method 15

Java 8 style

   JSONArray data = jsonObject.getJSONArray("some-node");

   List<JSONObject> list = StreamSupport.stream(data.spliterator(), false)
                .map(e -> (JSONObject)e)
                .collect(Collectors.toList());

Method 16

Single line code that I used to convert json array to ArrayList for the below listed json string stored in a variable named classData.

List<String> names = new Gson().fromJson(classData.getAsJsonObject("result").getAsJsonArray("names").toString(), new TypeToken<List<String>>(){}.getType());
{   
    "result": {
        "id": "104297",
        "class": "Chemistry",
        "total": 57,
        "names": [
            "Alex",
            "Dan",
            "Rex",
            "Tony",
            "Elizabeth"
        ],
        ...
    }
}

Method 17

public static List<JSONObject> getJSONObjectListFromJSONArray(JSONArray array) 
        throws JSONException {
  ArrayList<JSONObject> jsonObjects = new ArrayList<>();
  for (int i = 0; 
           i < (array != null ? array.length() : 0);           
           jsonObjects.add(array.getJSONObject(i++))
       );
  return jsonObjects;
}

Method 18

Generic variant

public static <T> List<T> getList(JSONArray jsonArray) throws Exception {

    List<T> list = new ArrayList<>(jsonArray.length());

    for (int i = 0; i < jsonArray.length(); i++) {

        list.add((T)jsonArray.get(i));
    }

    return list;

}

//Usage

List<String> listKeyString = getList(dataJsonObject.getJSONArray("keyString"));

Method 19

ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
 listdata.addAll(jArray);
}

@simplified

Method 20

A simpler Java 8 alternative:

JSONArray data = new JSONArray(); //create data from this -> [{"thumb_url":"tb-1370913834.jpg","event_id":...}]

List<JSONObject> list = data.stream().map(o -> (JSONObject) o).collect(Collectors.toList());

Method 21

With Kotlin, you can avoid a loop by wrapping the JSONArray with a MutableList, e.g.

val artistMetadata = player.metadata.optJSONArray("artist")
val artists = MutableList<String>(artistMetadata.length()) { i -> artistMetadata.getString(i)}

Method 22

public static List<String> convertJsonArrayToStringList(JsonArray ja){
    
    List<String> result = new ArrayList<String>();     
    for(JsonElement je: ja)
        result.add(je.getAsString());
    
    return result;
    
}

Method 23

This can do (Java >= 8):

    // Functional (variable)
    Function<JSONArray, ArrayList<String>> convert = jsonArray -> (ArrayList<String>) jsonArray.stream()
        .map(item -> item.toString())
        .collect(Collectors.toList());

    // Call
    convert.apply(jsonArray);


    // Regular method (OOP)
    private Function<JSONArray, ArrayList<String>> convert() {
        return jsonArray -> (ArrayList<String>) jsonArray.stream()
            .map(item -> item.toString())
            .collect(Collectors.toList());
   }

   // Call
   convert().apply(jsonArray);


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment