Unmarshal JSON для Java POJO в JAX-RS

Я ищу, чтобы получить ключ и значение для каждого форматированного вызова Json и использовать их как объекты Java, такие как String или Integer, в клиенте отдыха, который я бы ввел { "Имя": "HelloWorld" }

И я бы вернул HelloWorld, сопоставленный с его ключевым до сих пор видимыми примерами, но им просто не удалось выяснить, что делает каждый тег, и как разобрать тело, чтобы дать вышеприведенные результаты.

@POST
    @Path("/SetFeeds")
    @Consumes(MediaType.APPLICATION_JSON)   
    @Produces(MediaType.APPLICATION_JSON) 
    @JsonCreator

        public String setFeed(String jsonBody,@Context UriInfo uriInfo){        
...Code to manipulate the body of the request 
            return response;

    } 

Ответ 1

Прежде всего вам нужно понять, как выполняется разбор тела запроса. В разборе JAX-RS (или unmarshalling/deserializing/whatever) выполняется с MessageBodyReader s. Существуют разные читатели, которые могут обрабатывать разные типы контента. Например, если у вас есть Content-Type application/octet-stream, есть читатель, который будет развязать код byte [] или File или < код > InputStreamкод > . Таким образом, следующее будет работать в окне

<Предварительно > <код > @Consumes ( "Применение/октет-поток" ) public Response post (Файл файла) {}//или `byte []` или `InputStream` Код >

Таким образом, реализации JAX-RS поставляются с очень базовыми читателями для "легко конвертируемого" формата. Например, большинство запросов могут быть преобразованы в String, поэтому вы получаете это бесплатно для большинства типов контента, так же как и с вашим текущим кодом.

Если нам нужны более сложные типы данных, например ваш HelloWorld для Content-Type application/json, для этого нет стандартного читателя. Чтобы это сработало, нам нужно создать наш собственный читатель или использовать библиотеку, которая поставляется с читателем. К счастью, самая популярная структура JSON в Java, Jackson, внедрила поставщика JAX-RS, который имеет читатель и писатель (для сериализации).

Теперь, в зависимости от того, какую версию сервера /JAX -RS вы используете, различные реализации создают легкие обертки вокруг основного модуля Jackson JAX-RS. Если бы я знал реализацию JAX-RS, которую вы использовали, я мог бы порекомендовать, какую оболочку использовать, или вы можете забыть обертку и просто пойти с базовым модулем Джексона, который

<Предварительно > <код > < зависимость > < идентификатор_группа > com.fasterxml.jackson.jaxrs </GroupID> < артефакт > ДЖЕКСОН-jaxrs-JSON-поставщик </артефакт > < & версии GT; 2.2.3 </& версии GT; </зависимость > Код >

Выше была зависимость от Maven. Если вы не используете Maven, вам в основном нужно загрузить все эти банки.

jackson deps

Вы можете найти все из них здесь. Просто найдите их индивидуально.

Затем вам необходимо зарегистрировать поставщика. Опять же, это зависит от вашей реализации JAX-RS и того, как вы обрабатываете конфигурацию своих классов ресурсов. Мне нужно будет увидеть вашу конфигурацию приложения (либо web.xml, либо код Java), и, возможно, сервер, который вы используете, чтобы помочь с этим. По большей части необходимо зарегистрировать JacksonJsonProvider (который является читателем и писателем).

После того, как вы зарегистрировались, вам нужно понять основы того, как Джексон справляется с сериализацией. На уровне basic Джексон ищет свойства JavaBean ( базовый геттер/сеттер), чтобы соответствовать свойствам JSON. Например, если у вас есть это свойство Bean

  открытый класс HelloWorld {   private String name;
   public String getName() {       имя возврата;   }
   public void setName (имя строки) {       this.name = name;   }
}
Код>

JSON должен выглядеть как { "name": "whatever" }. Клавиша "name" совпадает с свойством Bean. В терминах свойств Bean имя свойства - это все буквы после get/set с первой буквой в нижнем регистре.

Это почти все, что нужно. Теперь вы можете сделать

<Предварительно > <код > @Consumes ( "применение/JSON" ) публичный ответ (HelloWorld helloWorld) {   String name = helloWorld.getName();//должно == "независимо"   return Response.ok(helloWorld).build();//мы можем также возвращать объекты } Код >

Для более сложных форматов JSON вы должны обратиться к документации Джексона или задать вопрос здесь на SO.

Что касается регистрации JacksonJsonProvider, если у вас возникли проблемы, предоставьте запрошенную мной информацию, то есть конфигурацию приложения (web.xml или конфигурацию Java) и сервер, который вы используете.

См. также:

  • JAX-RS Entity Provider, чтобы узнать подробнее о читателях и писателях