为了账号安全,请及时绑定邮箱和手机立即绑定

杰克逊从简单的字符串序列化 Joda DateTime

杰克逊从简单的字符串序列化 Joda DateTime

慕码人2483693 2023-06-14 11:12:24
我正在尝试从作为字符串发送的任意 json 中提取预定义类型(布尔值、整数、joda.DateTime)的值。例如:{"node1":{"node2":"2019-01-01T05:00:00.000Z"}}}假设我知道这个 Json 中的值是 DateTime 并且我可以2019-01-01T05:00:00.000Z从这个 Json 和 disabled 中提取值SerializationFeature.WRITE_DATES_AS_TIMESTAMPS。当我尝试序列化 org.joda.time.DateTime 的简单字符串表示形式“1972-12-28T12:00:01.000Z”时,它失败了JsonParseException: Unexpected character。但是,对于 TextNode 中的布尔值或 DateTime 字符串,序列化将成功。我已经用我的对象映射器注册了 com.fasterxml.jackson.datatype.joda.JodaModule。我已经尝试了一些东西,请参阅下面的 Junit 测试public class Tester {    public static class Bean {        public void Bean(){}        public DateTime start;    }    @Test    public void testJodaJsonSerialization() throws Exception{        ObjectMapper objectMapper = new ObjectMapper();        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);        objectMapper.registerModule(new JodaModule());        final String INPUT_JSON = "{\"start\" : \"1972-12-28T12:00:01.000Z\"}";        Bean bean = objectMapper.readValue(INPUT_JSON, Bean.class);        assertNotNull(bean.start);        System.out.println(objectMapper.writeValueAsString(bean)); //serializing as part of an object works        String boolAsString = "true";        Boolean aBoolean = objectMapper.readValue(boolAsString, Boolean.class); //works for bool (simple type)        System.out.println(aBoolean);        String dateAsTextNode = objectMapper.writeValueAsString(new TextNode("1972-12-28T12:00:01.000Z")); //works for TextNode        System.out.println("dateAsTextNode: " + dateAsTextNode);        DateTime dateTime = objectMapper.readValue(dateAsTextNode, DateTime.class);        System.out.println(dateTime);    }}我希望字符串序列化能像在 TextNode 上一样工作
查看完整描述

2 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

你的String

String dateAsString = "1972-12-28T12:00:01.000Z";

包含内容

1972-12-28T12:00:01.000Z

这不是有效的 JSON,因此 Jackson 无法解析它。

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

String dateAsString = "\"1972-12-28T12:00:01.000Z\"";

然后解析就会成功。


查看完整回答
反对 回复 2023-06-14
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

您可以在 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);


查看完整回答
反对 回复 2023-06-14
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信