Java 使用JaxRS定制JSON序列化

Java 使用JaxRS定制JSON序列化,java,json,jax-rs,Java,Json,Jax Rs,在webservice调用中,我希望返回具有此JSON结构的对象 { "date" : "30/06/2014", "price" : { "val" : "12.50", "curr" : "EUR" } } 我想将此JSON代码映射到此Java结构(使用和): 我的Web服务当前看起来如下所示: @javax.ws.rs.POST @javax.ws.rs.Path("test") @javax.ws.rs.Produces({MediaType.APPLICA

在webservice调用中,我希望返回具有此JSON结构的对象

{
  "date" : "30/06/2014",
  "price" : {
    "val" : "12.50",
    "curr" : "EUR"
  }
}
我想将此JSON代码映射到此Java结构(使用和):

我的Web服务当前看起来如下所示:

@javax.ws.rs.POST
@javax.ws.rs.Path("test")
@javax.ws.rs.Produces({MediaType.APPLICATION_JSON})
@javax.ws.rs.Consumes({MediaType.APPLICATION_JSON})
public MyResponse test(MyRequest request) {
  MyResponse response = new MyResponse();
  response.setDate(LocalDate.now());
  response.setMoney(Money.parse("EUR 12.50"));
  return response;
}
所以我的问题是:我应该在哪里注册一个自定义处理程序来格式化我想要的日期和货币表示?

如果您正在使用(这应该是JBoss EAP 6的默认值),那么您可以使用自定义处理程序

对于
LocalDate

public class DateSerializer extends JsonSerializer<LocalDate> {

    @Override
    public void serialize(LocalDate date, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        jgen.writeString(date.toString("dd/MM/yyyy"));
    }

}
两个序列化程序都可以全局注册:

@Provider
public class JacksonConfig implements ContextResolver<ObjectMapper> {

    private ObjectMapper objectMapper;

    public JacksonConfig() {
        objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule("MyModule", new Version(1, 0, 0, null));
        module.addSerializer(Money.class, new MoneySerializer());
        module.addSerializer(LocalDate.class, new DateSerializer());
        objectMapper.registerModule(module);
    }

    public ObjectMapper getContext(Class<?> objectType) {
        return objectMapper;
    }

}
@Provider
公共类JacksonConfig实现ContextResolver{
私有对象映射器对象映射器;
公共JacksonConfig(){
objectMapper=新的objectMapper();
SimpleModule=new SimpleModule(“MyModule”,新版本(1,0,0,null));
module.addSerializer(Money.class,new MoneySerializer());
addSerializer(LocalDate.class,new DateSerializer());
objectMapper.registerModule(模块);
}
公共对象映射器getContext(类objectType){
返回对象映射器;
}
}
要以这种自定义格式解析JSON,需要实现自定义


如果您正在使用,您可以对custom做同样的事情。

我相信您的Jax RS实现使用了一些库来处理JSON。例如,Spring为此目的使用了
Jackson
,通常在需要自定义序列化时,只需要使用
Jackson
APIs配置序列化行为。使用的框架似乎是
org.jboss.resteasy:jaxrs-api:jar:2.1.0.GA:provided
。考虑到它是提供的,我想它使用的是标准JBoss 6 JSon序列化程序,但我找不到哪个是。太好了,我会试试的!这是一个很好的线索,我可以让它工作,谢谢!是否可以在不知道实现的情况下自定义序列化?我只想通过实现一个自定义服务器来与任何jee服务器保持兼容
public class MoneySerializer extends JsonSerializer<Money> {

    @Override
    public void serialize(Money money, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        jgen.writeStartObject();
        jgen.writeStringField("val", money.getAmount().toString());
        jgen.writeStringField("curr", money.getCurrencyUnit().getCurrencyCode());
        jgen.writeEndObject();
    }

}
@Provider
public class JacksonConfig implements ContextResolver<ObjectMapper> {

    private ObjectMapper objectMapper;

    public JacksonConfig() {
        objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule("MyModule", new Version(1, 0, 0, null));
        module.addSerializer(Money.class, new MoneySerializer());
        module.addSerializer(LocalDate.class, new DateSerializer());
        objectMapper.registerModule(module);
    }

    public ObjectMapper getContext(Class<?> objectType) {
        return objectMapper;
    }

}