在网络服务调用中,我想返回具有此 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<LocalDate> {
@Override
public void serialize(LocalDate date, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeString(date.toString("dd/MM/yyyy"));
}
}
对于金钱
:
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;
}
}
要以这种自定义格式解析 JSON,您需要实现自定义 JsonDeserializers .
如果您使用 Jettison你可以用自定义做同样的事情 XmlAdapters .
关于java - 使用 JaxRS 自定义 JSON 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24489186/