【问题标题】:Jersey Problem with Parsing a JSONArray解析 JSONArray 的泽西岛问题
【发布时间】:2026-02-03 18:55:01
【问题描述】:

我正在尝试使用 jersey 框架实现资源。 但是如果我调用我的资源,我会得到一个解析异常,即解析器无法解析 JSONArray 数据类型。

这是我的资源结构:

@Path("/books")
@Consumes("application/json")
public class BookResource {

@GET
@Produces("application/json")
public JSONArray getAllBooksOfCurrentUser() {
    Book book = new Book();
    book.initDummyBook();
    JSONArray books = new JSONArray();
    Page page = new Page();
    page.setBook(book);
    page.setNumber(22);
    ReadStatistic readStatistic = new ReadStatistic();
    readStatistic.setLastReadAt(new Date());
    readStatistic.setLastPageRead(page);
    books.put(book.simpleRepresantationWithLastReadAsJson(readStatistic));
    return books;
}

}

这是个例外:

29.10.2010 11:42:57 org.apache.catalina.core.StandardWrapperValve 调用 SCHWERWIEGEND:Servlet ServletAdaptor 的 Servlet.service() 引发异常 org.codehaus.jackson.map.JsonMappingException:没有为类 org.codehaus.jettison.json.JSONArray 找到序列化程序,也没有发现用于创建 BeanSerializer 的属性(为避免异常,请禁用 SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS)) 在 org.codehaus.jackson.map.ser.StdSerializerProvider$1.serialize(StdSerializerProvider.java:62) 在 org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:296) 在 org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224) 在 org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:925) 在 org.codehaus.jackson.jaxrs.JacksonJsonProvider.writeTo(JacksonJsonProvider.java:497) 在 com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:299) 在 com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1326) 在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1239) 在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1229) 在 com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420) 在 com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:497) 在 com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:684) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879) 在 org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 在 org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 在 org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) 在 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 在 java.lang.Thread.run(Thread.java:680)

有谁知道怎么回事?

【问题讨论】:

    标签: java json parsing jersey


    【解决方案1】:

    我是 Jersey 的新手,但我认为如果您的方法返回的不是字符串,那么 JAXB 需要有一种方法来序列化它。我只是让我的方法返回一个字符串,将我的返回语句更改为:

    return myJsonArray.toString();
    

    并继续使用

    @Produces("application/json")
    

    这似乎奏效了。 codehaus jar 中可能有一个序列化程序,但还没有深入寻找。

    【讨论】:

      【解决方案2】:

      自从提出这个问题以来已经有一段时间了,但我刚刚遇到了同样的问题。我查看了一些 Jersey 示例,发现部署描述符的 web.xml 文件存在差异。这对我有用:

          <servlet-class>com.sun.jersey.server.impl.container.servlet.ServletAdaptor</servlet-class>
          <init-param>
              <param-name>com.sun.jersey.config.property.packages</param-name>
              <param-value>com.example.your.resources</param-value>
          </init-param>
      

      不知道这是否是一个错误,甚至不知道不同的 Jersey servlet 类之间有什么区别。只是想把(一些?)答案放在这里记录下来。

      也只是为了记录:在这种情况下,我使用 Jersey 1.5。

      更新:刚刚在 Jersey 1.11 上进行了测试,它也可以正常工作。

      【讨论】:

        【解决方案3】:

        在为 jackson 使用不同的 jar 时,我遇到了同样的问题:jackson-xc-1.9.2.jar: jackson-mapper-asl-1.9.2.jar: jackson-jaxrs-1.9.2.jar: jackson-核心asl-1.9.2.jar

        不确定有什么不同,但是当我切换到 jackson-all-1.9.2.jar 时,异常停止了。

        【讨论】:

          【解决方案4】:

          JAXB 默认不能序列化 JSONArray 和 JSONObject。

          将您的 JSONArray 转换为字符串是一种选择。

          还有另一种方法对我来说很好用:

          1. 将 JSONArray 更改为 List 类型;
          2. 将数组对象更改为 Map 类型;

          JAXB 默认序列化列表和地图,这个解决方案对我来说很好。

          【讨论】: