ERROR: Can not deserialize instance of java.lang.String out of START_OBJECT token

6.8k Views Asked by At

I'm using Jackson version 2.7.4 + EJB 3.0 with WebSphere 9.0. The classe has an attribute String date as below:

Class:

@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@AllArgsConstructor
public class filter {

    private String date;
    ...
}

When I call the method shows the error below.

Error:

Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token at [Source: org.apache.cxf.transport.http.AbstractHTTPDestination$1@b3f4efe6; line: 1, column: 163] at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:160) at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:194) at org.codehaus.jackson.map.deser.StdDeserializer$StringDeserializer.deserialize(StdDeserializer.java:607) at org.codehaus.jackson.map.deser.StdDeserializer$StringDeserializer.deserialize(StdDeserializer.java:576) at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:149) at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:237) at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:496) at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350) at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:1961) at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:889) at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:410) at org.apache.cxf.jaxrs.utils.JAXRSUtils$2.run(JAXRSUtils.java:1408) at java.security.AccessController.doPrivileged(AccessController.java:738) at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1404) at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1354) at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:878) at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:837) at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:265) at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:95) ... 29 more

Maven dependencies:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.7.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.7.4</version>
</dependency>

Does anyone have any idea?

2

There are 2 best solutions below

0
Luciana Oliveira On BEST ANSWER

It's a beginner question, so if you have the same error with different types the solution is the same.

JsonMappingException: Can Not Deserialize Instance Of

The Problem : This exception is thrown if the wrong type is used while deserializing.

The Solution: Checking the attribute has the different types.

In my problem, the solution was to change the type of angular date to a angular's native date to match to backend java type. You can create a main class to test your backend code like below.

Thanks the developers that comment this post. I could see the rubber duck technique applyed here. Thanks a lot.

public static void main(String[] args) {
    
    ObjectMapper objectMapper = new ObjectMapper();
    String json = ""; //Use your string json
    
    try {
        Person personDeserialized = objectMapper.readValue(json, Person.class);
    
    } catch (JsonParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JsonMappingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
7
Omar Hussien On

The start of the object should be like this { ,Make sure the json from the Front doesn't start with [

{
  "data": "any value"
}