2009-12-21 6 views
2

Я успешно маршалирую POJO в JSON, используя аннотации JAX-RS и JAXB.Marshall/Unmarshall JSON для класса Java с использованием JAXB

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

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

+0

, в котором вы используете JAX-RS? – skaffman

ответ

0

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

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

2

Я делаю это успешно в 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».

4

Маршаллинг в формате 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(); 
} 
+0

Этот ответ настолько бесполезен. Что такое JSONJAXBContex? Вы не предоставляете никакой информации о том, что так было. –

+0

Кажется, что com.sun.jersey.api.json.JSONJAXBContext из старых версий jersey-json. – seanf

 Смежные вопросы

  • Нет связанных вопросов^_^