我使用以下代码序列化从外部服务获取的响应,并返回作为我服务的一部分的json响应。但是,当外部服务返回时间值和时区(10:30:00.000-05.00)时,杰克逊将其转换为15:30:00。如何忽略时区值?
public interface DateFormatMixin {
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="HH:mm:ss")
public XMLGregorianCalendar getStartTime();
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="HH:mm:ss")
public XMLGregorianCalendar getEndTime();
}
public ObjectMapper objectMapper() {
com.fasterxml.jackson.databind.ObjectMapper responseMapper = new com.fasterxml.jackson.databind.ObjectMapper();
responseMapper.addMixIn(Time.class, DateFormatMixin.class);
return responseMapper;
}
答案 0 :(得分:3)
您可以创建自定义反序列化器
public class CustomJsonTimeDeserializerWithoutTimeZone extends JsonDeserializer<Time>{
@Override
public Time deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
DateFormat format = new SimpleDateFormat("hh:mm:ss.SSS");
Time time = null;
try{
Date dt = format.parse("10:30:00.000-05.00".substring(0,12)); // remove incorrect timezone format
return new Time(dt.getTime());
}catch (ParseException e){
e.printStackTrace();
}
}
}
告诉杰克逊使用您的自定义反序列化器
public class Model{
@JsonDeserialize(using = CustomJsonTimeDeserializerWithoutTimeZone.class)
private Time time;
}
并像这样使用它:
ObjectMapper mapper = new ObjectMapper();
String jsonString = ...// jsonString retrieve from external service
Model model = mapper.readValue(jsonString, Model.class);
您可以使用Jackson Custom Serialization为服务响应添加时区信息
答案 1 :(得分:0)
您可以如下创建反序列化器:
public Calendar deserialize(JsonParser jsonParser, DeserializationContext context)
throws IOException, JsonProcessingException {
DateFormat formatter = new SimpleDateFormat(("yyyy-MM-dd'T'HH:mm:ss.SSS"));
String date = jsonParser.getText();
try {
Calendar cal = Calendar.getInstance();
cal.setTime(formatter.parse(date));
return cal;
} catch (ParseException e) {
throw new RuntimeException(e);
}
}