使用JaxRS自定义JSON序列化
在webservice调用中,我想用这个JSON结构返回我的对象。
{ "date" : "30/06/2014", "price" : { "val" : "12.50", "curr" : "EUR" } }
我想将这个JSON代码映射到这个Java结构(使用joda-time和joda-money ):
public class MyResponse { LocalDate date; Money price; }
我的网络服务目前看起来像这样:
@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; }
所以我的问题是:我在哪里注册一个自定义处理程序来格式化我想要的日期以及货币表示?
如果您使用的是Jackson (应该是JBoss EAP 6的默认设置),您可以使用自定义JsonSerializers
对于LocalDate
:
public class DateSerializer extends JsonSerializer { @Override public void serialize(LocalDate date, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeString(date.toString("dd/MM/yyyy")); } }
为Money
:
public class MoneySerializer extends JsonSerializer { @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(); } }
两个Serializer都可以在全球注册:
@Provider public class JacksonConfig implements ContextResolver { 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; } }
要以此自定义格式解析JSON,您需要实现自定义JsonDeserializers 。
如果您使用Jettison,您可以使用自定义XmlAdapter执行相同的操作 。