I am trying to use jackson to serialize and deserialize a POJO. Going from POJO to JSON works perfectly but going the other direction does not.
I have a POJO
public class Event { private String kind; public String getKind() { return kind; } public void setKind(String kind) { this.kind = kind; } }
and to run and test I run package calendar.model;
Event event = new Event(); event.setKind("This is a kind"); String json = objectMapper.writeValueAsString(event); // RETURNS: "{\"kind\":\"This is a kind\"}" objectMapper.readValue(json, Event.class);
Throws Exception
java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonParser.getValueAsString()Ljava/lang/String; at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:24) at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11) at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375) at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:98) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:308) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2796) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1942) at calendar.controller.RootController.details(RootController.java:59) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:100) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:604) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:565) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
I have played with about all I can to get the JSON to POJO to work but it won't. It does work if I map from JSON to a Map type.
Thanks for the help
here is a grep for jackson in my dependencies
± > mvn dependency:tree | grep jackson -I- [INFO] +- com.google.http-client:google-http-client-jackson2:jar:1.13.1-beta:compile [INFO] | \- com.fasterxml.jackson.core:jackson-core:jar:2.0.5:compile [INFO] | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.1.1:compile [INFO] | | +- com.fasterxml.jackson.dataformat:jackson-dataformat-xml:jar:2.1.1:compile [INFO] | | | +- com.fasterxml.jackson.core:jackson-databind:jar:2.1.1:compile [INFO] | | | +- com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.1.0:compile
It looks like there is no other version of jackson except for jackson2.
The full method being run is a spring controller method.
@RequestMapping(value = "/") public Event root() throws IOException { Event event = new Event(); event.setKind("This is a kind"); String json = objectMapper.writeValueAsString(event); // RETURNS: "{\"kind\":\"This is a kind\"}" Event mapped = objectMapper.readValue(json, Event.class); return mapped; }
Jackson API provides two ways to ignore unknown fields, first at the class level using @JsonIgnoreProperties annotation and second at the ObjectMapper level using configure() method.
XML support Since 2.0 release, Jackson provides first class support for some other data formats than JSON. Spring Framework and Spring Boot provide builtin support for Jackson based XML serialization/deserialization.
Jackson uses default (no argument) constructor to create object and then sets value using setters. so you only need @NoArgsConstructor and @Setter.
It looks like the problem is that you are getting incompatible versions of jackson-core
and jackson-databind
- jackson-core 2.0.5 is being pulled in, but I believe at least 2.1.0 is required.
The first line of the exception tells you that it can't find the method JsonParser.getValueAsString()
, looking at the API docs for 2.0.5, that method indeed does not exist. It looks like it was added in 2.1.0.
So, you'll need to fix the dependencies - most likely by excluding 2.0.5 and including 2.1.0.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With