Marshall / Unmarshall JSON для класса Java с использованием JAXB - PullRequest
2 голосов
/ 21 декабря 2009

Я успешно перенаправил POJO в JSON с помощью аннотаций JAX-RS и JAXB.

Проблема в том, что когда я пытаюсь использовать его для отмены маршалинга моего запроса, он не работает. Насколько я вижу в документации JAX-RS может автоматически маршалировать и демаршировать строки application / json обратно в классы Java.

Нужно ли для этого создавать свой собственный MessageBodyReader или это поддерживается платформой без использования библиотек Джексона?

Ответы [ 3 ]

3 голосов
/ 30 мая 2013

Маршировать в XML легко, но мне потребовалось некоторое время, чтобы понять, как маршалировать в JSON. Довольно просто после того, как вы найдете решение.

public static String marshalToXml( Object o ) throws JAXBException {

    StringWriter writer = new StringWriter();
    Marshaller marshaller = JAXBContext.newInstance( o.getClass() ).createMarshaller();
    marshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );
    marshaller.marshal( o, writer );
    return writer.toString();
}

public static String marshalToJson( Object o ) throws JAXBException {

    StringWriter writer = new StringWriter();
    JAXBContext context = JSONJAXBContext.newInstance( o.getClass() );

    Marshaller m = context.createMarshaller();
    JSONMarshaller marshaller = JSONJAXBContext.getJSONMarshaller( m );
    marshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );
    marshaller.marshallToJSON( o, writer );
    return writer.toString();
}
2 голосов
/ 21 декабря 2009

Я успешно делал это в RESTEasy. У меня есть настроенный для использования и производства XML и JSON. Вот обработчик запроса:

@POST
@Produces(["application/json","application/xml"])
@Consumes(["application/json","application/xml"])
@Path("/create")
public Response postCreate(
         ReqData reqData) {
   log.debug("data.name is "+ data.getName());
   ...
   return Response.status(Response.Status.CREATED)
     .entity(whatever)
     .location(whateverURI)
     .build();

}

ReqData - это JavaBean, т. Е. У него есть конструктор по умолчанию, и он имеет сеттеры и геттеры, которые находит маршаллер. У меня нет специальных JSON-тегов в ReqData, но у меня есть @XmlRootElement (name = "data") вверху для маршаллера XML и тегов @XmlElement на установщиках.

Я использую отдельные компоненты для ввода и вывода, но, насколько я знаю, вы можете использовать один и тот же компонент.

Клиентская программа отправляет строку JSON в теле объекта запроса и устанавливает для заголовков Context-Type и Accept значение "application / json".

0 голосов
/ 21 декабря 2009

Я работал с Apache Wink, и для этого мне нужно было использовать JSON-провайдера, такого как Jettison (коллега использовал Джексона). Я записал шаги, которые я предпринял здесь

Полагаю, вам также потребуется использовать JSON-провайдер. Есть ли причина не использовать провайдера Джексона?

...