【问题标题】:Jackson Json and no such method errorsJackson Json 并没有这样的方法错误
【发布时间】:2013-02-01 14:38:41
【问题描述】:

我正在尝试使用 jackson 来序列化和反序列化 POJO。从 POJO 转为 JSON 效果很好,但反之则不行。

我有一个 POJO

public class Event {
  private String kind;

  public String getKind() {
    return kind;
  }

  public void setKind(String kind) {
    this.kind = kind;
  }
}

为了运行和测试,我运行包 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);

抛出异常

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)

我已经尽我所能让 JSON 到 POJO 工作,但它不会。如果我从 JSON 映射到 Map 类型,它确实有效。

感谢您的帮助

编辑

这是我的依赖项中杰克逊的一个 grep

± > 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

貌似除了jackson2之外没有其他版本的jackson了。

正在运行的完整方法是一个弹簧控制器方法。

@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 库。请发布更多具有代表性的代码,并验证哪些 Jackson JAR 与您的应用捆绑在一起。
  • @Perception 我编辑了这个问题,但实际上没有比我之前给出的更多内容了,如果您能更具体地了解可能有帮助的内容,也许我可以提供更多信息。

标签: java json jackson deserialization


【解决方案1】:

看起来问题是您获得了不兼容的jackson-corejackson-databind 版本 - jackson-core 2.0.5 被引入,但我相信至少需要 2.1.0。

异常的第一行告诉你它找不到方法JsonParser.getValueAsString(),查看2.0.5的API文档,该方法确实不存在。好像是在2.1.0中添加的。

因此,您需要修复依赖关系 - 很可能通过排除 2.0.5 并包括 2.1.0 来解决。

【讨论】:

  • 您可以添加声明适当版本的<dependencyManagement> 部分,而不是排除。比排除更优雅一点。
  • 完美的谢谢你们,最简单的方法是在我的 pom 中添加 jackson-core 2.1.1 作为显式依赖项,如果这不是我让我知道的最好方法的话。
  • 如果您下载适用于 Java 的 AWS 开发工具包,获取最新版本,然后 third-party 文件夹将包含您必须包含在类路径(不仅仅是构建路径)中的重要 jars....有点奇怪。
  • @austinbv 谢谢,当我使用最新版本的 jackson-core 时,它​​解决了我的问题: com.fasterxml.jackson。核心jackson-core2.7.5
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 2017-10-02
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多