当前位置: 首页 > 面试题库 >

Jackson Json并没有这样的方法错误

彭英逸
2023-03-14
问题内容

我正在尝试使用杰克逊对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-core和的不兼容版本jackson-databind-引入了jackson-core
2.0.5,但我认为至少需要2.1.0。

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

因此,您需要修复相关性-最有可能通过排除2.0.5和包括2.1.0来解决。



 类似资料:
  • 我们可能看到了错误: 既然这是正确的,为什么字节码记下了被调用方法的返回类型,并在用该方法的返回类型更新库时引发错误。

  • 我试图使用jackson来序列化和反序列化一个POJO。从POJO到JSON可以很好地工作,但是反过来就不行了。 我有一个POJO 并运行和测试我运行的包calendar.model 引发异常 我已经尽我所能让JSON到POJO工作,但它不会。如果我从JSON映射到map类型,它确实有效。 感谢您的帮助 这是我的依赖项中杰克逊的 grep 看起来除了jackson2,没有其他版本的jackson了

  • 问题内容: 我在Jenkins管道中使用JSON函数并获取。我正在使用Jenkins 2.85。 任何想法如何解决这个问题? 问题答案: 使用管道实用程序步骤插件可以使用该功能。 没有此插件,您将无法使用此功能。 有关更多信息,请检查:步骤

  • 我在我的API中使用条带连接,我想更新和处理现有的paymentIntent。使用NodeJS条带包创建paymentIntent成功 这将成功返回一个paymentIntent对象,该对象具有id('pi_yyy')、客户端密码('pi_yyy_secret_zzz')、状态('requires_payment_method')和更多字段。 但是,当使用返回的支付意图id进一步更新支付意图或使用

  • 我在Jenkins管道中使用下面的Groovy脚本来调用自由风格的作业,但它最终出现了“没有这样的DSL方法‘构建’”错误。

  • 我正在尝试使用Android Room,在完成本教程后,我在尝试构建应用程序时遇到以下错误: 这个名字很好,应该存在。在进行更改后,我清理了项目并确保它已从设备中完全卸载。 在我的中,我用这一行初始化中的内容: 这是我的代码: 应用数据库 许可证 许可证