Java Jackson从简单字符串序列化Joda DateTime

Java Jackson从简单字符串序列化Joda DateTime,java,json,jackson,Java,Json,Jackson,我试图从作为字符串发送的任意json中提取预定义类型Boolean、Integer、joda.DateTime的值。 例如:{node1:{node2:2019-01-01T05:00:00.000Z}}}然后说我知道这个Json中的值是一个日期时间,我可以从这个Json中提取值2019-01-01T05:00:00.000Z并禁用序列化功能。将日期作为时间戳写入 当我尝试序列化org.joda.time.DateTime的一个简单字符串表示形式1972-12-28512:00:01.000Z时

我试图从作为字符串发送的任意json中提取预定义类型Boolean、Integer、joda.DateTime的值。 例如:{node1:{node2:2019-01-01T05:00:00.000Z}}}然后说我知道这个Json中的值是一个日期时间,我可以从这个Json中提取值2019-01-01T05:00:00.000Z并禁用序列化功能。将日期作为时间戳写入

当我尝试序列化org.joda.time.DateTime的一个简单字符串表示形式1972-12-28512:00:01.000Z时,它失败了,出现了JsonParseException:意外字符。但是,对于TextNode中的布尔值或DateTime字符串,序列化将成功

我已经用我的对象映射器注册了com.fasterxml.jackson.datatype.joda.JodaModule

我已经尝试了一些方法,请参见下面的Junit测试

公共类测试员{ 公共静态类Bean{ 公共无效Bean{} 公共日期时间开始; } @试验 public void testJodaJsonSerialization引发异常{ ObjectMapper ObjectMapper=新的ObjectMapper; objectMapper.disableSerializationFeature.WRITE_DATES_作为_时间戳; objectMapper.RegisterModule新建JodaModule; 最终字符串输入_JSON={\start\:\1972-12-28512:00:01.000Z\}; Bean=objectMapper.readValueINPUT_JSON,Bean.class; assertNotNullbean.start; System.out.printlnobjectMapper.WriteValueAsTringBean;//作为对象的一部分序列化是有效的 字符串boolAsString=true; Boolean aBoolean=objectMapper.readValueboolAsString,Boolean.class;//适用于bool简单类型 System.out.printlnaBoolean; String dateAsTextNode=objectMapper.WriteValueAsString新文本节点1972-12-28512:00:01.000Z;//适用于文本节点 System.out.printlndateAsTextNode:+dateAsTextNode; DateTime DateTime=objectMapper.readValuedateAsTextNode,DateTime.class; System.out.printlndateTime; JsonNode jsonRoot=objectMapper.readTreeINPUT_JSON; 字符串datetimeAsString=jsonRoot.getstart.asText; objectMapper.readValueobjectMapper.WriteValueAsString新文本NodeDateTimeAsString,DateTime.class;//此解决方案将起作用 objectMapper.readValueobjectMapper.WriteValueAsString新文本NodeBoolasString,Boolean.class; 字符串dateAsString=1972-12-28512:00:01.000Z; objectMapper.readValuedateAsString,DateTime.class;//但此操作失败 } } 我希望字符串序列化可以像在TextNode上一样工作

包含内容

1972-12-28T12:00:01.000Z
它不是有效的JSON,因此Jackson无法解析它

如果它包含前导引号,那么它将是有效的JSON,所以

字符串dateAsString=\1972-12-28512:00:01.000Z\;
然后解析就会成功。

您可以在ObjectMapper级别配置日期格式的模式:

Value dateFormat = Value.forShape(Shape.STRING)
    .withPattern("MM/dd/yyyy HH:mm:ss")
    .withTimeZone(TimeZone.getTimeZone("UTC"));

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
    .registerModule(new Jdk8Module())
    .registerModule(new JavaTimeModule())
    .configOverride(DateTime.class).setFormat(dateFormat);

谢谢你的提示!是的,在引号中,它是一个有效的字符串json文本。布尔值是一个有效的json文本,因为{node1:true}是一个没有任何引号的有效json
Value dateFormat = Value.forShape(Shape.STRING)
    .withPattern("MM/dd/yyyy HH:mm:ss")
    .withTimeZone(TimeZone.getTimeZone("UTC"));

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
    .registerModule(new Jdk8Module())
    .registerModule(new JavaTimeModule())
    .configOverride(DateTime.class).setFormat(dateFormat);