【问题标题】:Jackson JSON schema date杰克逊 JSON 模式日期
【发布时间】:2014-08-18 16:01:04
【问题描述】:

我想生成一个带有 java.util.Date 字段的类的 JSON schema。 对于我得到的日期类型的字段:

“字段名”:{ “类型”:“整数”, “格式”:“UTC_MILLISEC” }

我想要的是这样的:

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

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

谢谢!

【问题讨论】:

  • 看看这个link能不能帮到你。

标签: java json jackson jsonschema


【解决方案1】:

这只是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"
    }
  }
}

【讨论】:

  • 我忘了回答关于如何生成模式的部分问题。非常感谢您提供此信息。
【解决方案2】:

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

【讨论】:

  • 查看 Alexey 的示例,了解如何在设置正确后实际生成架构输出。
【解决方案3】:

Jackson 有一个漂亮的自定义 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。您唯一需要做的就是修改序列化程序,使其序列化正确的值。

【讨论】:

  • 如何回答有关 schema 的问题?
猜你喜欢
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
相关资源
最近更新 更多