The error message “javax.json.bind.JsonbException: Can’t deserialize JSON array into: class com.yawintutor.Student” will be shown in the spring boot application if you attempt to convert json string to object java. We’ll see in this post about this exception and how this exception can be resolved.
The program attempts to deserialize the json string into a java object. The data binding api can not deserialize the string due to the json string and the java class not matching. The spring boot application will read and interpret the json file, the error is when the parsed input is translated to the java object
Exception in thread "main" javax.json.bind.JsonbException: Can't deserialize JSON array into: class com.yawintutor.Student
at org.eclipse.yasson.internal.serializer.DeserializerBuilder.build(DeserializerBuilder.java:151)
at org.eclipse.yasson.internal.Unmarshaller.deserializeItem(Unmarshaller.java:66)
at org.eclipse.yasson.internal.Unmarshaller.deserialize(Unmarshaller.java:52)
at org.eclipse.yasson.internal.JsonBinding.deserialize(JsonBinding.java:59)
at org.eclipse.yasson.internal.JsonBinding.fromJson(JsonBinding.java:66)
at com.yawintutor.SpringBootJsonbSimpleApplication.JSONToJavaObjectArray(SpringBootJsonbSimpleApplication.java:49)
at com.yawintutor.SpringBootJsonbSimpleApplication.main(SpringBootJsonbSimpleApplication.java:19)
Root Cause
The exception “javax.json.bind.JsonbException: Can’t deserialize JSON array into: class com.yawintutor.Student” clearly states that during deserialization of the json string, it has some issue. The json string contains root as array of objects. In the spring boot application, it attempts to convert to a java object. Java can not allocate an array to an object.
Convert the json string into object array in the “fromJson” api. This addresses the exception.
How to reproduce this issue
In the spring boot application, add all dependency for json binding. create a json string containing objects in an array. Using “from Json” api in the program to convert json string to an object in java. The input json string includes an object list, and the program attempts to allocate to an object in java. This is going to throw out the exception.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.yawintutor</groupId>
<artifactId>Spring-Application</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringBootJsonbSimple</name>
<description>Spring Boot Project</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.json.bind</groupId>
<artifactId>javax.json.bind-api</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse</groupId>
<artifactId>yasson</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Student.java
package com.yawintutor;
public class Student {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
SpringBootJsonbSimpleApplication.java
package com.yawintutor;
import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootJsonbSimpleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootJsonbSimpleApplication.class, args);
JavaObjectArraytoJSON();
JSONToJavaObjectArray();
}
public static void JavaObjectArraytoJSON() {
Student student1 = new Student();
student1.setId(100);
student1.setName("Yawin");
Student student2 = new Student();
student2.setId(101);
student2.setName("Spring Boot");
Student[] studentArray = new Student[2];
studentArray[0] = student1;
studentArray[1] = student2;
Jsonb jsonb = JsonbBuilder.create();
String jsonString = jsonb.toJson(studentArray);
System.out.println("Json format String : " + jsonString);
}
public static void JSONToJavaObjectArray() {
String jsonString = "[{\"id\":100,\"name\":\"Yawin\"},{\"id\":101,\"name\":\"Spring Boot\"}]";
Jsonb jsonb = JsonbBuilder.create();
Student st = jsonb.fromJson(jsonString, Student.class);
System.out.println(st.getId() + " " + st.getName());
}
Solution 1
The json string includes objects in an array. Hence, type cast the json string to an array of java objects. This will resolve this exception. The code below illustrates how to transform a json string to an array of objects in java.
Student[] studentArray = jsonb.fromJson(jsonString, new Student[] {}.getClass() );
The complete java code to convert from a json string to a Java object array is shown as
SpringBootJsonbSimpleApplication.java
package com.yawintutor;
import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootJsonbSimpleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootJsonbSimpleApplication.class, args);
JavaObjectArraytoJSON();
JSONToJavaObjectArray();
}
public static void JavaObjectArraytoJSON() {
Student student1 = new Student();
student1.setId(100);
student1.setName("Yawin");
Student student2 = new Student();
student2.setId(101);
student2.setName("Spring Boot");
Student[] studentArray = new Student[2];
studentArray[0] = student1;
studentArray[1] = student2;
Jsonb jsonb = JsonbBuilder.create();
String jsonString = jsonb.toJson(studentArray);
System.out.println("Json format String : " + jsonString);
}
public static void JSONToJavaObjectArray() {
String jsonString = "[{\"id\":100,\"name\":\"Yawin\"},{\"id\":101,\"name\":\"Spring Boot\"}]";
Jsonb jsonb = JsonbBuilder.create();
Student[] studentArray = jsonb.fromJson(jsonString, new Student[] {}.getClass() );
for(Student st : studentArray) {
System.out.println(st.getId() + " " + st.getName());
}
}
Output
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.2.5.RELEASE)
2020-03-16 07:51:20.073 INFO 52723 --- [ main] c.y.SpringBootJsonbSimpleApplication : Starting SpringBootJsonbSimpleApplication on banl1691b9157 with PID 52723 (/Users/knatarajan2/STS/workspace/SpringBootJsonbSimple/target/classes started by knatarajan2 in /Users/knatarajan2/STS/workspace/SpringBootJsonbSimple)
2020-03-16 07:51:20.075 INFO 52723 --- [ main] c.y.SpringBootJsonbSimpleApplication : No active profile set, falling back to default profiles: default
2020-03-16 07:51:20.489 INFO 52723 --- [ main] c.y.SpringBootJsonbSimpleApplication : Started SpringBootJsonbSimpleApplication in 0.649 seconds (JVM running for 3.209)
Json format String : [{"id":100,"name":"Yawin"},{"id":101,"name":"Spring Boot"}]
100 Yawin
101 Spring Boot
Solution 2
More details on how to use json binding api are explained in the links below.
Step 2 – JSON String to Java Object using JSON-B
Step 3 – JSON String to Java Object Array using JSON-B
Step 4 – JSON String to Generic Java Object using JSON-B
Step 5 – How to Serialize and Deserialize Enum with JSON-B / Yasson