java - 使用 JaxRS 自定义 JSON 序列化

标签 java json jax-rs

在网络服务调用中,我想返回具有此 JSON 结构的对象。

{
  "date" : "30/06/2014",
  "price" : {
    "val" : "12.50",
    "curr" : "EUR"
  }
}

我想将此 JSON 代码映射到此 Java 结构(使用 joda-timejoda-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/

相关文章:

java - java中的自定义长度唯一密码

java - 获取 'android:name' 属性 : 时出错

java - Angular 2 中使用服务 JAX-RS 的授权 header

java - HttpResponse 中的状态代码错误

Java if条件代码优化

java - GSON 不会反序列化对外部类的引用

android - 使用 getValue() 从 DataSnapshot 解析到 Firebase 中的 Java 类

java - 使用 Argo 解析 JSON

java - 在 DropWizard 或 Jetty 应用程序中导致 404 的日志 URL

java - 仅对二维数组的行求和并将总和放入新数组中