Elaine Ettariel
Elaine Ettariel

Reputation: 21

How to get a value which is a List from a JSONObject in Java

I have a following JSON:

{"data":["str1", "str2", "str3"]}

I want to get a List, i.e. ["str1", "str2", "str3"]

My code is:

JSONObject json = new JSONObject();
List list = new ArrayList();
...
// adding data in json
...
list = (List) json.get("data");

This is not working.

Upvotes: 1

Views: 9420

Answers (4)

tbatch
tbatch

Reputation: 1839

Behind the scenes, the JSONArray object stores the json data in an ArrayList<Object>, and it has a method called toList(). There's absolutely no need to loop through the JSONArray in order to set values in the array. The simpler code would look something like this

String data = "{\"data\":[\"str1\", \"str2\", \"str3\"]}";
JSONObject json = new JSONObject(data);

List<Object> list = json.getJSONArray("data").toList();

System.out.println(myList);

Note: This will create a list of generic Objects. The currently accepted answer doesn't define a type for the List, which is unsafe. It doesn't enforce type safety, and errors will occur at runtime instead of at compile time.

If you want to convert all of the inner objects to a String, you can do this by upcasting the List to an Object, and then casting it to a List<String>. I don't particularly recommend it, but it can be done like this. List<String> list = (List<String>) (Object) json.getJSONArray("data").toList();.

A better way of casting the value to a specific type would be via a stream to call the Object.toString() method.

List<String> list = json.getJSONArray("data").toList().stream().map(Object::toString).collect(Collectors.toList());

or, if you have a specific type you want to cast it to, you can use

List<MyObject> list = json.getJSONArray("data").toList().stream().map(jsonObject -> (MyObject) jsonObject).collect(Collectors.toList());

Finally, as others have pointed out, there are better libraries for dealing with json. Gson is a great library, however I personally prefer Jackson. They both offer similar resources, but I've found that Jackson's ObjectMapper is more customizable and more widely used.

Upvotes: 0

Abra
Abra

Reputation: 20914

You wish to parse a JSON string using Java code. It is recommended to use a JSON library for Java. There are several. The below code uses Gson. There are many online examples such as Convert String to JsonObject with Gson. You should also familiarize yourself with the Gson API.

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.util.ArrayList;
import java.util.List;

public class JsonList {

    public static void main(String[] args) {
        String json = "{\"data\":[\"str1\", \"str2\", \"str3\"]}";
        JsonElement elem = JsonParser.parseString(json);
        if (elem.isJsonObject()) {
            JsonObject obj = elem.getAsJsonObject();
            elem = obj.get("data");
            if (elem.isJsonArray()) {
                JsonArray arr = elem.getAsJsonArray();
                List<String> list = new ArrayList<>();
                int count = arr.size();
                for (int i = 0; i < count; i++) {
                    elem = arr.get(i);
                    if (elem.isJsonPrimitive()) {
                        String str = elem.getAsString();
                        list.add(str);
                    }
                }
                System.out.println(list);
            }
        }
    }
}

Running the above code gives the following output:

[str1, str2, str3]

There are other ways to convert the JsonArray to a List. The above is not the only way. As I wrote earlier, peruse the API documentation and search the Internet.

Upvotes: 0

Vasim Hayat
Vasim Hayat

Reputation: 929

You can customize a little bit of code like it

public static void main(String[] args) throws ParseException {
        String data = "{\"data\":[\"str1\", \"str2\", \"str3\"]}";
        JSONObject json = new JSONObject(
                data);
         
        JSONArray jasonArray = json.getJSONArray("data");
        List list = new ArrayList();

        int size = jasonArray.length();
        int i = 0;
        while (i < size) {
            list.add(jasonArray.get(i));
            i++;
        }

        System.out.println(list);

    }

Upvotes: 1

Rohit Lalwani
Rohit Lalwani

Reputation: 579

you can get this data as a JsonArray

Upvotes: 2

Related Questions