convert ArrayList<MyCustomClass> to JSONArray

AndroidJsonArraylistArraysJsonobject

Android Problem Overview


I have an ArrayList that I use within an ArrayAdapter for a ListView. I need to take the items in the list and convert them to a JSONArray to send to an API. I've searched around, but haven't found anything that explains how this might work, any help would be appreciated.

UPDATE - SOLUTION

Here is what I ended up doing to solve the issue.

Object in ArrayList:

public class ListItem {
	private long _masterId;
	private String _name;
	private long _category;

	public ListItem(long masterId, String name, long category) {
		_masterId = masterId;
		_name = name;
		_category = category;
	}

	public JSONObject getJSONObject() {
		JSONObject obj = new JSONObject();
		try {
			obj.put("Id", _masterId);
			obj.put("Name", _name);
			obj.put("Category", _category);
		} catch (JSONException e) {
			trace("DefaultListItem.toString JSONException: "+e.getMessage());
		}
		return obj;
	}
}

Here is how I converted it:

ArrayList<ListItem> myCustomList = .... // list filled with objects
JSONArray jsonArray = new JSONArray();
for (int i=0; i < myCustomList.size(); i++) {
        jsonArray.put(myCustomList.get(i).getJSONObject());
}

And the output:

[{"Name":"Name 1","Id":0,"Category":"category 1"},{"Name":"Name 2","Id":1,"Category":"category 2"},{"Name":"Name 3","Id":2,"Category":"category 3"}]

Hope this helps someone some day!

Android Solutions


Solution 1 - Android

If I read the JSONArray constructors correctly, you can build them from any Collection (arrayList is a subclass of Collection) like so:

ArrayList<String> list = new ArrayList<String>();
list.add("foo");
list.add("baar");
JSONArray jsArray = new JSONArray(list);

References:

Solution 2 - Android

Use Gson library to convert ArrayList to JsonArray.

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();

Solution 3 - Android

As somebody figures out that the OP wants to convert custom List to org.json.JSONArray not the com.google.gson.JsonArray,the CORRECT answer should be like this:

Gson gson = new Gson();

String listString = gson.toJson(
                    targetList,
           new TypeToken<ArrayList<targetListItem>>() {}.getType());

 JSONArray jsonArray =  new JSONArray(listString);

Solution 4 - Android

public void itemListToJsonConvert(ArrayList<HashMap<String, String>> list) {
	
    	JSONObject jResult = new JSONObject();// main object
		JSONArray jArray = new JSONArray();// /ItemDetail jsonArray

		for (int i = 0; i < list.size(); i++) {
			JSONObject jGroup = new JSONObject();// /sub Object

			try {
				jGroup.put("ItemMasterID", list.get(i).get("ItemMasterID"));
				jGroup.put("ID", list.get(i).get("id"));
				jGroup.put("Name", list.get(i).get("name"));
				jGroup.put("Category", list.get(i).get("category"));

				jArray.put(jGroup);

				// /itemDetail Name is JsonArray Name
				jResult.put("itemDetail", jArray);
				return jResult;
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}

	}

Solution 5 - Android

With kotlin and Gson we can do it more easily:

  1. First, add Gson dependency:

> implementation "com.squareup.retrofit2:converter-gson:2.3.0"

  1. Create a separate kotlin file, add the following methods

> import com.google.gson.Gson > import com.google.gson.reflect.TypeToken >
> fun Gson.convertToJsonString(t: T): String { > return toJson(t).toString() > } >
> fun Gson.convertToModel(jsonString: String, cls: Class): T? { > return try { > fromJson(jsonString, cls) > } catch (e: Exception) { > null > } > } >
> inline fun Gson.fromJson(json: String) = this.fromJson(json, object: TypeToken() {}.type)

Note: Do not add declare class, just add these methods, everything will work fine.

  1. Now to call:

create a reference of gson: > val gson=Gson()

To convert array to json string, call:

val jsonString=gson.convertToJsonString(arrayList)

To get array from json string, call:

val arrayList=gson.fromJson<ArrayList<YourModelClassName>>(jsonString)

To convert a model to json string, call:

val jsonString=gson.convertToJsonString(model)

To convert json string to model, call:

val model=gson.convertToModel(jsonString, YourModelClassName::class.java)

Solution 6 - Android

Add to your gradle:

implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

Convert ArrayList to JsonArray

JsonArray jsonElements = (JsonArray) new Gson().toJsonTree(itemsArrayList);

Solution 7 - Android

I know its already answered, but theres a better solution here use this code :

for ( Field f : context.getFields() ) {
     if ( f.getType() == String.class ) || ( f.getType() == String.class ) ) {
           //DO String To JSON
     }
     /// And so on...
}

This way you can access variables from class without manually typing them..

Faster and better .. Hope this helps.

Cheers. :D

Solution 8 - Android

Here is a solution with jackson:

You could use the ObjectMapper to receive a JSON String and then convert the string to a JSONArray.

import com.fasterxml.jackson.databind.ObjectMapper;
import org.json.JSONArray;

List<CustomObject> myList = new ArrayList<>();
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(myList);
JSONArray jsonArray = new JSONArray(jsonString);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionpmkoView Question on Stackoverflow
Solution 1 - AndroidNanneView Answer on Stackoverflow
Solution 2 - AndroidPurushothamView Answer on Stackoverflow
Solution 3 - AndroidzionpiView Answer on Stackoverflow
Solution 4 - Androiddhamat chetanView Answer on Stackoverflow
Solution 5 - AndroidSuraj VaishnavView Answer on Stackoverflow
Solution 6 - AndroidDeep PatelView Answer on Stackoverflow
Solution 7 - AndroidralphgabbView Answer on Stackoverflow
Solution 8 - AndroidDeniz HusajView Answer on Stackoverflow