gpt4 book ai didi

java - jackson/json 模式 - 用外部 json 模式生成器模块替换 ISO8601Utils

转载 作者:行者123 更新时间:2023-11-29 04:11:37 25 4
gpt4 key购买 nike

我正在替换 ISO8601Utils,这是由于 SonarQube 抛出以下错误而在下面评论的: Remove this use of "ISO8601Utils";它已被弃用。 要替换它,我将使用外部 json 模式生成器模块 https://github.com/FasterXML/jackson-module-jsonSchema或者是其他东西。我通读了链接,但不明白如何使用对象映射器来替换这一行:String value = ISO8601Utils.format(date, true);

    public static class ISO8601DateFormat extends DateFormat {

public ISO8601DateFormat() {}

public StringBuffer format(Date date, StringBuffer toAppendTo,
FieldPosition fieldPosition) {
String value = ISO8601Utils.format(date, true);
//Im not sure how I can replace this line with a new
//replacement

toAppendTo.append(value);
return toAppendTo;
}

public Date parse(String source, ParsePosition pos) {
pos.setIndex(source.length());
return ISODateTimeFormat.dateTimeParser().parseDateTime(source).toDate();
}

public Object clone() {
return this;
}

public String toString() {
return this.getClass().getName();
}
}

如有任何帮助,我们将不胜感激!

附言我正在编写一个单元测试来验证 ISO8601Utils 和 SimpleDateFormat 是否具有相同的格式。

我更新的类(class):

    public static class ISO8601DateFormat extends DateFormat {

public static final long serialVersionUID = 3549786448500970210L;

public ISO8601DateFormat() {}

@Override
public StringBuffer format(Date date, StringBuffer toAppendTo,
FieldPosition fieldPosition) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
String value = dateFormat.format(date);
toAppendTo.append(value);
return toAppendTo;
}

public Date parse(String source, ParsePosition pos) {
pos.setIndex(source.length());
return ISODateTimeFormat.dateTimeParser().parseDateTime(source).toDate();
}

public Object clone() {
return this;
}

public String toString() {
return this.getClass().getName();
}
}

我的测试方法:

  @Test
public void testDateFormat() {
df = new DefaultHttpClientUtil.ISO8601DateFormat();
Date date = new Date();
// df.setTimeZone(TimeZone.getTimeZone("GMT")); I'm getting NPE
// for this line

assertThat(df.format(date)).isEqualTo(ISO8601Utils.format(date,
true));
}

但是,我得到注释行的空指针异常。我认为它与注入(inject)或模拟对象有关,但我不确定应该如何解决这个问题。

最佳答案

ISO8601DateFormatISO8601Utils自版本 2.9 以来已弃用,并且没有提供明确的文档说明在弃用后要做什么。 GitHub 上有一个问题:ISO8601DateFormat is deprecated but replacement is unclear与你的问题有关。

我想,您团队中的某个人刚刚使用他/她发现的 first class 将 Date 序列化为 ISO8601 格式并且没有引起人们的广泛关注来自 Jackson 库。我建议不要使用您出于其他原因使用的库中的内部 *Utils 类。在这种情况下,序列化/反序列化 JSON。现在,我们有很多如何格式化日期的选项,您应该选择一个适合您的选项。大多数情况下,这取决于您使用的是哪个 JDK 版本。

因此,改为:

String value = ISO8601Utils.format(date, true);

使用例如SimpleDateFormat:

DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

如您所见,下面的示例为两种情况打印了相同的日期:

import com.fasterxml.jackson.databind.util.ISO8601Utils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class JsonApp {

public static void main(String[] args) throws Exception {
Date date = new Date();
DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
df2.setTimeZone(TimeZone.getTimeZone("GMT"));

System.out.println(ISO8601Utils.format(date, true));
System.out.println(df2.format(date));
}
}

以上代码打印:

2019-02-19T19:37:14.809Z
2019-02-19T19:37:14.809Z

ISO8601Utils.format 的第二个参数是 true 这意味着您需要毫秒的结果和格式应该类似于 yyyy-MM-ddThh:mm:ss .sss'Z'.

更多信息,请阅读:

  1. Converting ISO 8601-compliant String to java.util.Date
  2. How to convert time in YYYY-MM-DDTHH:mm:ss.SSSZ format to default timezone?

关于java - jackson/json 模式 - 用外部 json 模式生成器模块替换 ISO8601Utils,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54771865/

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