Marshall / Unmarshall使用JAXB将JSON添加到Java类

时间:2009-12-21 05:52:18

标签: java json jaxb jax-rs

我使用JAX-RS和JAXB注释成功地将POJO编组为JSON。

问题在于,当我尝试使用相同的方法来解组我的请求时,它不起作用。据我所知,documentation JAX-RS可以自动封送和解组应用程序/ json字符串回到java类。

我是否需要为此创建自己的MessageBodyReader,或者框架是否支持此而不使用Jackson库?

3 个答案:

答案 0 :(得分:3)

编组到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();
}

答案 1 :(得分: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,即它有一个默认的构造函数,它有marshaller找到的setter和getter。我在ReqData中没有任何特殊的JSON标记,但我在顶层有@XmlRootElement(name =“data”),用于设置者的XML编组和@XmlElement标记。

我使用单独的bean来输入和输出,但据我所知你可以使用相同的bean。

客户端程序在请求的实体主体中发送JSON字符串,并将Context-Type和Accept头都设置为“application / json”。

答案 2 :(得分:0)

我一直在使用Apache Wink,因此我需要使用JSON提供程序,例如Jettison(一位同事一直在使用Jackson)。我写了我采取的步骤here

我的猜测是你也需要使用JSON提供程序。有没有理由不使用杰克逊提供商?