我有一个来自API的日期格式,格式如下:
"start_time": "2015-10-1 3:00 PM GMT+1:00"
这是YYYY-DD-MM HH:MM am/pm GMT时间戳。我将这个值映射到POJO中的一个日期变量。显然,它显示了转换错误。
我想知道两件事:
发布于 2012-09-18 00:45:11
我需要使用什么格式来执行与杰克逊的转换?Date是一个很好的字段类型吗?
在这方面,Date
是一个很好的字段类型。通过使用ObjectMapper.setDateFormat
,可以非常容易地对JSON进行解析
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm a z");
myObjectMapper.setDateFormat(df);
一般来说,在变量被
映射到对象成员之前,有没有一种方法来处理它们?例如,更改格式、计算等。
是。您有几个选择,包括实现自定义的JsonDeserializer
,例如扩展JsonDeserializer<Date>
。This是一个很好的开始。
发布于 2014-11-24 18:02:04
从Jackson v2.0开始,你可以直接在对象成员上使用@JsonFormat注解;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm a z")
private Date date;
发布于 2015-12-12 15:48:56
当然,还有一种称为序列化和反序列化的自动化方法,您也可以使用pb2q提到的特定注释(@JsonSerialize,@JsonDeserialize)来定义它。
您可以同时使用java.util.Date和java.util.Calendar ...也许JodaTime也是如此。
@JsonFormat注解对我不起作用,因为我想要(它已经将时区调整为不同的值)在反序列化期间(序列化工作完美):
@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是我的实现
序列化程序类:
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类:
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);
}
}
}
和上述类的使用:
public class CalendarEntry {
@JsonSerialize(using = CustomCalendarSerializer.class)
@JsonDeserialize(using = CustomCalendarDeserializer.class)
private Calendar calendar;
// ... additional things ...
}
使用此实现时,序列化和反序列化过程的执行将连续产生原始值。
只使用@JsonFormat注释,反序列化给出了不同的结果,我认为,因为库的内部时区默认设置,你不能用注释参数改变(这也是我使用Jackson库2.5.3和2.6.3版本的经验)。
https://stackoverflow.com/questions/12463049
复制相似问题