首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >到JSON Jackson的日期格式映射

到JSON Jackson的日期格式映射
EN

Stack Overflow用户
提问于 2012-09-18 00:03:01
回答 9查看 506K关注 0票数 177

我有一个来自API的日期格式,格式如下:

代码语言:javascript
复制
"start_time": "2015-10-1 3:00 PM GMT+1:00"

这是YYYY-DD-MM HH:MM am/pm GMT时间戳。我将这个值映射到POJO中的一个日期变量。显然,它显示了转换错误。

我想知道两件事:

  1. 我需要使用什么格式来执行与杰克逊的转换?Date是一个很好的字段类型吗?
  2. 一般来说,有没有一种方法可以在变量被杰克逊映射到对象成员之前对其进行处理?例如,更改格式、计算等。
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-09-18 00:45:11

我需要使用什么格式来执行与杰克逊的转换?Date是一个很好的字段类型吗?

在这方面,Date是一个很好的字段类型。通过使用ObjectMapper.setDateFormat,可以非常容易地对JSON进行解析

代码语言:javascript
复制
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm a z");
myObjectMapper.setDateFormat(df);

一般来说,在变量被

映射到对象成员之前,有没有一种方法来处理它们?例如,更改格式、计算等。

是。您有几个选择,包括实现自定义的JsonDeserializer,例如扩展JsonDeserializer<Date>This是一个很好的开始。

票数 147
EN

Stack Overflow用户

发布于 2014-11-24 18:02:04

从Jackson v2.0开始,你可以直接在对象成员上使用@JsonFormat注解;

代码语言:javascript
复制
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm a z")
private Date date;
票数 376
EN

Stack Overflow用户

发布于 2015-12-12 15:48:56

当然,还有一种称为序列化和反序列化的自动化方法,您也可以使用pb2q提到的特定注释(@JsonSerialize@JsonDeserialize)来定义它。

您可以同时使用java.util.Date和java.util.Calendar ...也许JodaTime也是如此。

@JsonFormat注解对我不起作用,因为我想要(它已经将时区调整为不同的值)在反序列化期间(序列化工作完美):

代码语言:javascript
复制
@JsonFormat(locale = "hu", shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "CET")

@JsonFormat(locale = "hu", shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Europe/Budapest")

如果您想要预测的结果,您需要使用自定义序列化程序和自定义反序列化程序,而不是@格式注释。我在这里找到了非常好的教程和解决方案http://www.baeldung.com/jackson-serialize-dates

这里有Date字段的示例,但我需要日历字段,所以here是我的实现

序列化程序类:

代码语言:javascript
复制
public class CustomCalendarSerializer extends JsonSerializer<Calendar> {

    public static final SimpleDateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    public static final Locale LOCALE_HUNGARIAN = new Locale("hu", "HU");
    public static final TimeZone LOCAL_TIME_ZONE = TimeZone.getTimeZone("Europe/Budapest");

    @Override
    public void serialize(Calendar value, JsonGenerator gen, SerializerProvider arg2)
            throws IOException, JsonProcessingException {
        if (value == null) {
            gen.writeNull();
        } else {
            gen.writeString(FORMATTER.format(value.getTime()));
        }
    }
}

deserializer类:

代码语言:javascript
复制
public class CustomCalendarDeserializer extends JsonDeserializer<Calendar> {

    @Override
    public Calendar deserialize(JsonParser jsonparser, DeserializationContext context)
            throws IOException, JsonProcessingException {
        String dateAsString = jsonparser.getText();
        try {
            Date date = CustomCalendarSerializer.FORMATTER.parse(dateAsString);
            Calendar calendar = Calendar.getInstance(
                CustomCalendarSerializer.LOCAL_TIME_ZONE, 
                CustomCalendarSerializer.LOCALE_HUNGARIAN
            );
            calendar.setTime(date);
            return calendar;
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}

和上述类的使用

代码语言:javascript
复制
public class CalendarEntry {

    @JsonSerialize(using = CustomCalendarSerializer.class)
    @JsonDeserialize(using = CustomCalendarDeserializer.class)
    private Calendar calendar;

    // ... additional things ...
}

使用此实现时,序列化和反序列化过程的执行将连续产生原始值。

只使用@JsonFormat注释,反序列化给出了不同的结果,我认为,因为库的内部时区默认设置,你不能用注释参数改变(这也是我使用Jackson库2.5.3和2.6.3版本的经验)。

票数 59
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12463049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档