Jacksonjson XML公历日历反序列化器

smtd7mpg  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(126)

我在解析json时遇到了问题。它有一个日期,例如“2014-01-07”。当它解析为createUserRequest.getBirthday()时,它包含“2014-01- 07 T04:00:00.000+04:00”。我需要在createUserRequest对象中使用它,然后我将使用另一个对象Assert它。问题是如何仅获得“2014-01-07”?
在CreateUserRequest中,我有XMLGregorianCalendar变量,无法更改它。
受保护的XMLGregorianCalendar生日;
下面只是抽出部分代码。忽略类名和变量名。

public class Test {
    private static final ObjectMapper MAPPER = new ObjectMapper();

    public static <T> T parseJson(String pathname, Class<T> objectClass) throws Exception {
        return MAPPER.readValue(new File(pathname), objectClass);
    }

    public void parse() throws Exception {
        CreateUserRequest createUserRequest =
                Test.parseJson("src/test/resources/createUser.json", CreateUserRequest.class);
        System.out.println(createUserRequest.getBirthday());
    }
}
xzlaal3s

xzlaal3s1#

第一个月

您的问题不清楚,但是如果您要询问如何解析以文本形式表示为"2014-01-07"的日期值,答案是解析为LocalDate对象。

LocalDate ld = LocalDate.parse( "2014-01-07" ) ;

XMLGregorianCalendar类表示一个时刻,一个日期,以及在特定时区中看到的一天中的时间。对于一个只有日期的值,这是一个错误的类。而且,这个类现在是遗留的,几年前被现代的 java.time 类所取代。
Jackson的最新版本支持 * java.time *。

转换

如果由尚未更新到 java.time 的代码处理XMLGregorianCalendar对象,则将该遗留类转换为现代的 java.time 类。
查看添加到旧类中的新转换方法。
您需要通过GregorianCalendar将您的XMLGregorianCalendar对象转换为ZonedDateTime

GregorianCalendar gc = myXmlGregorianCalendar.toGregorianCalendar() ;
ZonedDateTime zdt = gc.toZonedDateTime() ;

一个ZonedDateTime表示一个特定时区中的日期和时间,但是你只对日期部分感兴趣,所以提取一个LocalDate对象。

LocalDate ld = zdt.toLocalDate() ;

LocalDate#isEqual与您的目标日期进行比较。

LocalDate target = LocalDate.parse( "2014-01-07" ) ;
if( ld.isEqual( target ) ) { … }

相关问题