杰克逊JSON架构日期

时间:2014-08-18 16:01:05

标签: java json jackson jsonschema

我想使用java.util.Date字段生成类的JSON 模式。 对于类型为Date的字段,我得到:

" fieldName的" :{       "输入":"整数",       "格式":" UTC_MILLISEC"     }

我想要的是:

" fieldName的" :{" type":" string"," format":" date-time" }

我希望这个配置对于​​所有POJOS都是全局的,而不仅仅是针对特定的POJO。 因此,对特定类的注释对我没有帮助。

谢谢!

3 个答案:

答案 0 :(得分:5)

这只是the Dennis's answer示例SerializationFeature.WRITE_DATES_AS_TIMESTAMPS实际考虑到the Jackson schema generator的一个示例。

public class JacksonSchema1 {

    public static class Bean {
        public String name;
        public Date date;
    }

    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();
        mapper.acceptJsonFormatVisitor(mapper.constructType(Bean.class), visitor);
        JsonSchema jsonSchema = visitor.finalSchema();
        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema));
    }
}

输出:

{
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "date" : {
      "type" : "string",
      "format" : "DATE_TIME"
    }
  }
}

答案 1 :(得分:4)

如果您只想将日期输出为字符串,则应禁用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS实例上的配置OjectMapper。然后,每个转换的Date对象都将写为字符串。有关序列化功能的详细信息,请参阅this link

答案 2 :(得分:2)

杰克逊有一个漂亮的自定义JsonSerializer课程,你可以扩展。您基本上只需创建一个扩展JsonSerializer<Date>并覆盖serialize方法的新类。

以下是一个例子。

public class DateSerializer extends JsonSerializer<Date> {
  @Override
  public void serialize(Date date, JsonGenerator jgen, SerializerProvider provider)
    throws IOException, JsonProcessingException {
      jgen.writeStartObject();
      jgen.writeStringField("format", "date-time");
      jgen.writeStringField("type", "string");
      jgen.writeEndObject();
  }
}

接下来,我们需要使用正在使用的ObjectMapper注册序列化程序。

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Date.class, new DateSerializer());
mapper.registerModule(module);

这应该会给你正在寻找的JsonSerialization。您唯一需要做的就是修改序列化程序,以便序列化正确的值。