BAEL-6076: Resolving Jackson JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token (#13495)

This commit is contained in:
Azhwani 2023-02-28 06:11:01 +01:00 committed by GitHub
parent 444cc4ac2d
commit c1564c38a0
4 changed files with 109 additions and 5 deletions

View File

@ -0,0 +1,15 @@
package com.baeldung.exceptions;
public class Contact {
private String email;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}

View File

@ -0,0 +1,33 @@
package com.baeldung.exceptions;
public class Person {
private String firstName;
private String lastName;
private String contact;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getContact() {
return contact;
}
public void setContact(String contact) {
this.contact = contact;
}
}

View File

@ -0,0 +1,33 @@
package com.baeldung.exceptions;
public class PersonContact {
private String firstName;
private String lastName;
private Contact contact;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Contact getContact() {
return contact;
}
public void setContact(Contact contact) {
this.contact = contact;
}
}

View File

@ -3,17 +3,14 @@ package com.baeldung.exceptions;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.List;
import org.junit.Test;
import com.baeldung.exceptions.User;
import com.baeldung.exceptions.UserWithPrivateFields;
import com.baeldung.exceptions.UserWithRoot;
import com.baeldung.exceptions.Zoo;
import com.baeldung.exceptions.ZooConfigured;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonFactory;
@ -82,6 +79,32 @@ public class JacksonExceptionsUnitTest {
.readValue(json);
}
@Test
public void givenJsonObject_whenDeserializingIntoString_thenException() throws IOException {
final String json = "{\"firstName\":\"Azhrioun\",\"lastName\":\"Abderrahim\",\"contact\":{\"email\":\"azh@email.com\"}}";
final ObjectMapper mapper = new ObjectMapper();
Exception exception = assertThrows(JsonMappingException.class, () -> mapper.reader()
.forType(Person.class)
.readValue(json));
assertTrue(exception.getMessage()
.contains("Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)"));
}
@Test
public void givenJsonObject_whenDeserializingIntoObject_thenDeserialize() throws IOException {
final String json = "{\"firstName\":\"Azhrioun\",\"lastName\":\"Abderrahim\",\"contact\":{\"email\":\"azh@email.com\"}}";
final ObjectMapper mapper = new ObjectMapper();
PersonContact person = mapper.reader()
.forType(PersonContact.class)
.readValue(json);
assertEquals("azh@email.com", person.getContact()
.getEmail());
}
@Test
public void givenDefaultConstructor_whenDeserializing_thenCorrect() throws IOException {
final String json = "{\"id\":1,\"name\":\"John\"}";