How to convert JSON string into List of Java object?

JavaJsonJacksonJackson Databind

Java Problem Overview


This is my JSON Array :-

[ 	{		"firstName" : "abc",    	"lastName" : "xyz"	}, 	{		"firstName" : "pqr",		"lastName" : "str"	} ]

I have this in my String object. Now I want to convert it into Java object and store it in List of java object. e.g. In Student object. I am using below code to convert it into List of Java object : -

ObjectMapper mapper = new ObjectMapper();
StudentList studentList = mapper.readValue(jsonString, StudentList.class);

My List class is:-

public class StudentList {

	private List<Student> participantList = new ArrayList<Student>();

	//getters and setters
}

My Student object is: -

class Student {

	String firstName;
	String lastName;

	//getters and setters
}

Am I missing something here? I am getting below exception: -

Exception : com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.aa.Student out of START_ARRAY token

Java Solutions


Solution 1 - Java

You are asking Jackson to parse a StudentList. Tell it to parse a List (of students) instead. Since List is generic you will typically use a TypeReference

List<Student> participantJsonList = mapper.readValue(jsonString, new TypeReference<List<Student>>(){});

Solution 2 - Java

For any one who looks for answer yet:

1.Add jackson-databind library to your build tools like Gradle or Maven

2.in your Code:

ObjectMapper mapper = new ObjectMapper();

List<Student> studentList = new ArrayList<>();

studentList = Arrays.asList(mapper.readValue(jsonStringArray, Student[].class));

Solution 3 - Java

You can also use Gson for this scenario.

Gson gson = new Gson();
NameList nameList = gson.fromJson(data, NameList.class);

List<Name> list = nameList.getList();

Your NameList class could look like:

class NameList{
 List<Name> list;
 //getter and setter
}

Solution 4 - Java

You can use below class to read list of objects. It contains static method to read a list with some specific object type. It is included Jdk8Module changes which provide new time class supports too. It is a clean and generic class.

List<Student> students = JsonMapper.readList(jsonString, Student.class);

Generic JsonMapper class:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import java.io.IOException;
import java.util.*;

import java.util.Collection;

public class JsonMapper {

	public static <T> List<T> readList(String str, Class<T> type) {
		return readList(str, ArrayList.class, type);
	}

	public static <T> List<T> readList(String str, Class<? extends Collection> type, Class<T> elementType) {
		final ObjectMapper mapper = newMapper();
		try {
			return mapper.readValue(str, mapper.getTypeFactory().constructCollectionType(type, elementType));
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	private static ObjectMapper newMapper() {
		final ObjectMapper mapper = new ObjectMapper();
		mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
		mapper.registerModule(new JavaTimeModule());
		mapper.registerModule(new Jdk8Module());
		return mapper;
	}
}

Solution 5 - Java

StudentList studentList = mapper.readValue(jsonString,StudentList.class);

Change this to this one

StudentList studentList = mapper.readValue(jsonString, new TypeReference<List<Student>>(){});

Solution 6 - Java

I made a method to do this below called jsonArrayToObjectList. Its a handy static class that will take a filename and the file contains an array in JSON form.

 List<Items> items = jsonArrayToObjectList(
            "domain/ItemsArray.json",  Item.class);

    public static <T> List<T> jsonArrayToObjectList(String jsonFileName, Class<T> tClass) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        final File file = ResourceUtils.getFile("classpath:" + jsonFileName);
        CollectionType listType = mapper.getTypeFactory()
            .constructCollectionType(ArrayList.class, tClass);
        List<T> ts = mapper.readValue(file, listType);
        return ts;
    }

Solution 7 - Java

use below simple code, no need to use any other library, besides GSON

String list = "your_json_string";
Gson gson = new Gson();                         
Type listType = new TypeToken<ArrayList<YourClassObject>>() {}.getType();
ArrayList<YourClassObject> users = new Gson().fromJson(list , listType);

Solution 8 - Java

I have resolved this one by creating the POJO class (Student.class) of the JSON and Main Class is used for read the values from the JSON in the problem.

   **Main Class**

	public static void main(String[] args) throws JsonParseException, 
       JsonMappingException, IOException {

	String jsonStr = "[ \r\n" + "    {\r\n" + "        \"firstName\" : \"abc\",\r\n"
			+ "        \"lastName\" : \"xyz\"\r\n" + "    }, \r\n" + "    {\r\n"
			+ "        \"firstName\" : \"pqr\",\r\n" + "        \"lastName\" : \"str\"\r\n" + "    } \r\n" + "]";

	ObjectMapper mapper = new ObjectMapper();

	List<Student> details = mapper.readValue(jsonStr, new 
      TypeReference<List<Student>>() { 		});

	for (Student itr : details) {

		System.out.println("Value for getFirstName is: " + 
                  itr.getFirstName());
		System.out.println("Value for getLastName  is: " + 
                 itr.getLastName());
	}
}

**RESULT:**
         Value for getFirstName is: abc
         Value for getLastName  is: xyz
         Value for getFirstName is: pqr
         Value for getLastName  is: str


 **Student.class:**

public class Student {
private String lastName;

private String firstName;

public String getLastName() {
	return lastName;
}

public String getFirstName() {
	return firstName;
} }

Solution 9 - Java

Try this. It works with me. Hope you too!

List<YOUR_OBJECT> testList = new ArrayList<>();
testList.add(test1);

Gson gson = new Gson();

String json = gson.toJson(testList);

Type type = new TypeToken<ArrayList<YOUR_OBJECT>>(){}.getType();

ArrayList<YOUR_OBJECT> array = gson.fromJson(json, type);

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
QuestionNiteshView Question on Stackoverflow
Solution 1 - JavaManos NikolaidisView Answer on Stackoverflow
Solution 2 - JavaSobhanView Answer on Stackoverflow
Solution 3 - JavaPankaj JaiswalView Answer on Stackoverflow
Solution 4 - JavaerhunView Answer on Stackoverflow
Solution 5 - JavamonstereoView Answer on Stackoverflow
Solution 6 - JavajavaPlease42View Answer on Stackoverflow
Solution 7 - JavaPrakash ReddyView Answer on Stackoverflow
Solution 8 - JavaAtul Kumar SharmaView Answer on Stackoverflow
Solution 9 - JavaĐào Đức HuyView Answer on Stackoverflow