ObjectMapper SetDateFormat()不起作用

时间:2016-07-08 06:15:31

标签: java json spring

我使用ObjectMapper将对象映射到Json String。 我在对象中有日期字段来格式化我使用下面代码的日期,但它没有按预期格式化。

我的Json字符串:

{"leaveRequestId":51,"reason":"xdvfsgf","leaveFromDate":"2016-07-13","leaveToDate":"2016-07-15","leaveTypeId":9,"statusId":1,"instanceId":"7527","createdBy":"pramod","createdOn":"2016-07-07","modifiedBy":null,"modifiedOn":null}

我使用以下代码:

@RequestMapping(value="/getLeaveRequest", method = RequestMethod.GET)
@ResponseBody
public  String getLeaveRequest( int leaveRequestId) throws Exception {
 DAOFactory obj_daofactory=new DAOFactory();
 ObjectMapper mapper = new ObjectMapper();
 SimpleDateFormat df = new SimpleDateFormat("yyyy-MMM-dd");
 mapper.setDateFormat(df);

 LeaveRequest leaveRequest = obj_daofactory.getLeaveRequestDao().findByLeaveRequestId(leaveRequestId);
 if(leaveRequest.getLeaveRequestId() == 0){
     return "No data found";
 } else {
     System.out.println(leaveRequest.getLeaveFromDate().toString());
     String jsonInString = mapper.writeValueAsString(leaveRequest);
     System.out.println(jsonInString);
     return jsonInString;
    }
}

我期望的OutPut:

{"leaveRequestId":45,"reason":"test","leaveFromDate":"2016-Jul-07","leaveToDate":"2016-Jul-08","leaveTypeId":9,"statusId":1,"instanceId":"test1","createdBy":"deepak.paul@muraai.com","createdOn":"2016-Jul-07","modifiedBy":"pramod","modifiedOn":"2016-Jul-08"}

日期必须采用“2016年7月7日”格式

LeaveRequest.java

import java.util.Date;

public class LeaveRequest {
    private int leaveRequestId;
    private String reason;
    private Date leaveFromDate;
    private Date leaveToDate;
    private int leaveTypeId;
    private int statusId;
    private String instanceId;
    private String createdBy;
    private Date createdOn;
    private String modifiedBy;
    private Date modifiedOn;

    public LeaveRequest() {

    }

    public LeaveRequest(int leaveRequestId, String reason, Date leaveFromDate, Date leaveToDate,int leaveTypeId,int statusId, String instanceId,
            String createdBy, Date createdOn, String modifiedBy, Date modifiedOn)   {
        this.leaveRequestId=leaveRequestId;
        this.reason=reason;
        this.leaveFromDate=leaveFromDate;
        this.leaveToDate=leaveToDate;
        this.leaveTypeId=leaveTypeId;
        this.statusId=statusId;
        this.instanceId=instanceId;
        this.createdBy=createdBy;
        this.createdOn=createdOn;
        this.modifiedBy=modifiedBy;
        this.modifiedOn=modifiedOn;
    }
    public LeaveRequest(String reason, Date leaveFromDate, Date leaveToDate,int leaveTypeId,int statusId, String instanceId,
            String createdBy, Date createdOn)   {
        this.reason=reason;
        this.leaveFromDate=leaveFromDate;
        this.leaveToDate=leaveToDate;
        this.leaveToDate=leaveToDate;
        this.leaveTypeId=leaveTypeId;
        this.statusId=statusId;
        this.instanceId=instanceId;
        this.createdBy=createdBy;
        this.createdOn=createdOn;
    }
    public int getLeaveRequestId() {
        return leaveRequestId;
    }

    public void setLeaveRequestId(int leaveRequestId) {
        this.leaveRequestId = leaveRequestId;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public Date getLeaveToDate() {
        return leaveToDate;
    }

    public void setLeaveToDate(Date leaveToDate) {
        this.leaveToDate = leaveToDate;
    }

    public Date getLeaveFromDate() {
        return leaveFromDate;
    }

    public void setLeaveFromDate(Date leaveFromDate) {
        this.leaveFromDate = leaveFromDate;
    }

    public int getStatusId() {
        return statusId;
    }

    public void setStatusId(int statusId) {
        this.statusId = statusId;
    }

    public int getLeaveTypeId() {
        return leaveTypeId;
    }

    public void setLeaveTypeId(int leaveTypeId) {
        this.leaveTypeId = leaveTypeId;
    }

    public String getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public Date getCreatedOn() {
        return createdOn;
    }

    public void setCreatedOn(Date createdOn) {
        this.createdOn = createdOn;
    }

    public String getModifiedBy() {
        return modifiedBy;
    }

    public void setModifiedBy(String modifiedBy) {
        this.modifiedBy = modifiedBy;
    }

    public Date getModifiedOn() {
        return modifiedOn;
    }

    public void setModifiedOn(Date modifiedOn) {
        this.modifiedOn = modifiedOn;
    }

    public String getInstanceId() {
        return instanceId;
    }

    public void setInstanceId(String instanceId) {
        this.instanceId = instanceId;
    }

}

4 个答案:

答案 0 :(得分:1)

正如您所说,您输入的是 2016-07-13 ,即yyyy-MM-dd格式。您必须使用yyyy-MM-dd阅读并在撰写时使用yyyy-MMM-dd

   ObjectMapper mapper = new ObjectMapper();
        try {
            mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
            LeaveRequest lrq = mapper.readValue("{\"leaveRequestId\":51,\"reason\":\"xdvfsgf\",\"leaveFromDate\":\"2016-07-13\",\"leaveToDate\":\"2016-07-15\",\"leaveTypeId\":9,\"statusId\":1,\"instanceId\":\"7527\",\"createdBy\":\"pramod\",\"createdOn\":\"2016-07-07\",\"modifiedBy\":null,\"modifiedOn\":null}", LeaveRequest.class);
            System.out.println(mapper.setDateFormat(new SimpleDateFormat("yyyy-MMM-dd")).writeValueAsString(lrq));
        } catch (IOException ex) {
            Logger.getLogger(NewClass1.class.getName()).log(Level.SEVERE, null, ex);
        }

答案 1 :(得分:1)

当您根据需要通过ObjectMapper操作/修改内容时,必须进行序列化和反序列化。您可以参考有关此here

的更多信息

此主题也已经讨论过here

答案 2 :(得分:0)

我编写了这段代码,将日期转换为“ yyyy-MM-dd”,理想情况下应该可以,但是没有实现

    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    dateFormat.setTimeZone(TimeZone.getDefault());
    ObjectMapper mapper = new ObjectMapper();
    mapper.setDateFormat(dateFormat);
    myObj =objectMapper.readValue(file,MyObj.class)

输出为-"paymentDate": "2019-08-18T23:00:00.000+0000",这不是我期望的。。

将其更改为将ObjectMapper声明为Bean,然后将ObjectMapper注入为依赖项

    //Make sure the class is annotated with @Configuration or appropriate

  @Bean
    public ObjectMapper objectMapper() {
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    dateFormat.setTimeZone(TimeZone.getDefault());
    ObjectMapper mapper = new ObjectMapper();
    mapper.setDateFormat(dateFormat);
    return mapper;
}

和服务中类,只需将其作为依赖项注入

@Autowired
private ObjectMapper objectMapper;

somemethod(){
  myObj =objectMapper.readValue(file,MyObj.class)
 }

输出如预期的那样-“ paymentDate”:“ 2019-08-19”-

答案 3 :(得分:-1)

似乎是leaveFromDate等字段......您正在使用java.sql.Date,您应该将它们转换为java.util.DateSimpleFormatDate也正常运行。