如何重用Jersey的JSON/JAXB进行序列化?

ctw*_*mey 28 json jax-rs jersey

我有一个使用Jersey实现的JAX-RS REST服务.JAX-RS/Jersey的一个很酷的功能就是如何轻松地将POJO变成REST服务,只需简单地添加一些Java注释......包括一个简单的机制,用于将POJO转换为JSON - 使用JAXB注释.

现在,我希望能够利用这种非常酷的JSON-ifying功能用于非REST目的 - 我希望能够将这些对象中的一些序列化为磁盘,作为JSON文本.这是我想要序列化的示例JAXB对象:

@XmlRootElement(name = "user")
public class UserInfoImpl implements UserInfo {

    public UserInfoImpl() {} 

    public UserInfoImpl(String user, String details) {
        this.user = user;
        this.details = details;
    }

    public String getUser() { return user; }
    public void setUser(String user) { this.user = user; }

    public String getDetails() { return details; }
    public void setDetails(String details) { this.details = details; }

    private String user;
    private String details;
}
Run Code Online (Sandbox Code Playgroud)

泽西可以将其中一个变成json而没有额外的信息.我想知道泽西是否已经在API中公开了这个功能,以满足我的需求?到目前为止我找不到运气了......

谢谢!

更新2009-07-09:我已经了解到我可以使用Providers对象几乎完全按照我的意愿行事:

  @Context Providers ps;
  MessageBodyWriter uw = ps.getMessageBodyWriter(UserInfoImpl.class, UserInfoImpl.class, new Annotation[0], MediaType.APPLICATION_JSON_TYPE);

  uw.writeTo(....)
Run Code Online (Sandbox Code Playgroud)

...这将对象作为json写入任何输出流,这对我来说是完美的,但我只能使用@Component对象中的@Context来获取Providers对象.有没有人知道如何从常规的,未注释的POJO访问它?谢谢!

小智 19

Jersey使用几个不同的框架,具体取决于您使用的是mapped(),badgerfish()还是natural()表示法.自然通常是人们想要的.我相信这是使用非常好的(并且非常快)独立的Jackson JSON处理器实现的,它来自Object-> JAXB-> JSON.但Jackson也提供了自己的JAX-RS提供程序来直接使用Object-> JSON.

实际上,他们甚至添加了对JAXB注释的支持.看一下

http://wiki.fasterxml.com/JacksonJAXBAnnotations

我认为这最终是你在寻找的.杰克逊做对象< - > JSON处理......泽西只是为你打电话

  • 好吧,想一想:你需要一个用于XML序列化的库(JAXB,XStream等).您需要一个JSON的JSON库:JAXB不提供它; 泽西岛也将它发送到图书馆.所以问题是要添加哪些lib; 不管你是否需要添加东西.因此杰克逊(或json-tools,gson)可以轻松完成.JAX-RS提供商实际上只是调度员在媒体类型上操作,选择"视图"呈现(json,xml,...),然后调用适当的库. (2认同)

Ond*_*žka 6

这是一个使用JAXB将对象映射到JSON的简单示例(使用Jackson):

http://ondra.zizka.cz/stranky/programovani/java/jaxb-json-jackson-howto.texy


Rim*_*asK 5

ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(pojoObject);
Run Code Online (Sandbox Code Playgroud)