Проблема с анализом JSONArray - PullRequest
       8

Проблема с анализом JSONArray

0 голосов
/ 29 октября 2010

Я пытаюсь реализовать Ресурс с помощью структуры джерси. Но если я вызову свой ресурс, я получу исключение при синтаксическом анализе, что анализатор не может проанализировать тип данных 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.service () для сервлета ServletAdaptor сгенерировал исключение 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) at java.lang.Thread.run (Thread.java:680)

Кто-нибудь знает, что происходит не так?

Ответы [ 4 ]

3 голосов
/ 25 ноября 2011

Я новичок в Джерси, но я думаю, что если ваш метод возвращает что-либо, кроме String, JAXB должен найти способ его сериализации. Я только что получил мой метод, возвращающий String, изменил мой оператор return на:

return myJsonArray.toString();

и продолжал использовать

@Produces("application/json")

Это, похоже, сработало. Вероятно, в сосуде с кодхаусом есть сериализатор, но я не стал его искать.

2 голосов
/ 12 января 2012

У меня была такая же проблема при использовании разных 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, исключение прекратилось.

2 голосов
/ 11 марта 2011

прошло много времени с тех пор, как был задан этот вопрос, но я столкнулся с той же проблемой. Я просмотрел некоторые примеры на Джерси и обнаружил различия в файлах 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>

Понятия не имею, является ли это ошибкой или вообще чем отличаются классы сервлетов Джерси. Просто хотел разместить (какой?) Ответ здесь для записи.

А также для справки: в этом случае я использовал Джерси 1.5.

ОБНОВЛЕНО: только что проверил это на Джерси 1.11, и это также работает.

0 голосов
/ 12 ноября 2014

JAXB не может сериализовать JSONArray и JSONObject по умолчанию.

Вариант преобразования вашего JSONArray в строку.

Есть еще один способ, который мне подходит:

  1. Измените JSONArray на тип List;
  2. Измените объекты массива на тип Map;

JAXB сериализует списки и карты по умолчанию, это решение отлично работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...