gpt4 book ai didi

java - Jackson 从简单的字符串序列化 Joda DateTime

转载 作者:行者123 更新时间:2023-12-02 09:35:27 25 4
gpt4 key购买 nike

我试图从作为字符串发送的任意 json 中提取预定义类型( boolean 、整数、joda.DateTime)的值。例如: {"node1":{"node2":"2019-01-01T05:00:00.000Z"}}} 并说我知道这个 Json 中的值是 DateTime 并且我可以从此 Json 中提取值 2019-01-01T05:00:00.000Z 并禁用 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS

当我尝试序列化 org.joda.time.DateTime 的简单字符串表示形式“1972-12-28T12:00:01.000Z”时,它失败并显示 JsonParseException: 意外字符。但是,对于 TextNode 内的 boolean 值或日期时间字符串,序列化将会成功。

我已经使用我的对象映射器注册了 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);


JsonNode jsonRoot = objectMapper.readTree(INPUT_JSON);
String datetimeAsString = jsonRoot.get("start").asText();
objectMapper.readValue(objectMapper.writeValueAsString(new TextNode(datetimeAsString)), DateTime.class); //this workaround will work
objectMapper.readValue(objectMapper.writeValueAsString(new TextNode(boolAsString)), Boolean.class);

String dateAsString = "1972-12-28T12:00:01.000Z";
objectMapper.readValue(dateAsString, DateTime.class); //but this fails
}
}

我希望字符串序列化能够像在 TextNode 上一样工作

最佳答案

您的字符串

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\"";

然后解析就成功了。

关于java - Jackson 从简单的字符串序列化 Joda DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57559005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com