2015-10-08 2 views
2

У меня есть объект, который имеет 2 объекта XMLGregorianCalendar - один используется для даты, а другой используется для времени. Я использую Mapper объекта Jackson для преобразования даты в формате JSON. Дата перед конвертацией - 2014-02-10 & раз 11:15:00. После преобразования в JSON он становится {"date": 1392008400000, "time": 58500000}. Как сохранить ту же дату & формат времени ({"date": 2014-02-10, "time": 11: 15: 00}) после печати в JSON. ,Сохранить формат даты XMLGregorianCalendar после преобразования в JSON - Jackson Lib

import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.GregorianCalendar; 

import javax.xml.datatype.DatatypeConfigurationException; 
import javax.xml.datatype.DatatypeConstants; 
import javax.xml.datatype.DatatypeFactory; 
import javax.xml.datatype.XMLGregorianCalendar; 

import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.SerializationFeature; 


public class TestJSON { 

    public static void main(String[] args){ 

     Date dob=null; 
     Date time=null; 
     DateFormat df=new SimpleDateFormat("yyyy-MM-dd"); 
     DateFormat df1=new SimpleDateFormat("hh:mm:ss"); 
     try { 
      dob=df.parse("2014-02-10"); 
      time=df1.parse("11:15:00"); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     System.out.println(" Date = " + dob); 
     System.out.println(" Time = " + time); 

     GregorianCalendar cal = new GregorianCalendar(); 
     GregorianCalendar cal1 = new GregorianCalendar(); 
     try { 
      cal.setTime(df.parse("2014-02-10")); 
      cal1.setTime(df1.parse("11:15:00")); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     XMLGregorianCalendar xmlDate = null; 
     XMLGregorianCalendar xmlDate1 = null; 
     try { 
      xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED); 
      xmlDate1 = DatatypeFactory.newInstance().newXMLGregorianCalendarTime(cal1.get(Calendar.HOUR),cal1.get(Calendar.MINUTE),cal.get(Calendar.SECOND), DatatypeConstants.FIELD_UNDEFINED); 
     } catch (DatatypeConfigurationException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     System.out.println(" Before Converting - Date " + xmlDate); 
     System.out.println(" Before Converting - Time " + xmlDate1); 

     Data data = new Data(); 
     data.setDate(xmlDate); 
     data.setTime(xmlDate1); 



     ObjectMapper mapper = new ObjectMapper(); 
     try { 
      System.out.println("After Converting " + mapper.writeValueAsString(data)); 
     } catch (JsonProcessingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 


} 




import javax.xml.datatype.XMLGregorianCalendar; 

public class Data { 

    private XMLGregorianCalendar date; 
    private XMLGregorianCalendar time; 

    public XMLGregorianCalendar getDate() { 
     return date; 
    } 
    public void setDate(XMLGregorianCalendar date) { 
     this.date = date; 
    } 
    public XMLGregorianCalendar getTime() { 
     return time; 
    } 
    public void setTime(XMLGregorianCalendar time) { 
     this.time = time; 
    } 



} 

РАБОЧИЙ КОД (С Mixins)

import java.text.DateFormat; 
    import java.text.ParseException; 
    import java.text.SimpleDateFormat; 
    import java.util.Calendar; 
    import java.util.Date; 
    import java.util.GregorianCalendar; 

    import javax.xml.datatype.DatatypeConfigurationException; 
    import javax.xml.datatype.DatatypeConstants; 
    import javax.xml.datatype.DatatypeFactory; 
    import javax.xml.datatype.XMLGregorianCalendar; 

    import com.fasterxml.jackson.core.JsonProcessingException; 
    import com.fasterxml.jackson.databind.ObjectMapper; 
    import com.fasterxml.jackson.databind.SerializationFeature; 


    public class TestJSON { 

     public static void main(String[] args){ 

      Date dob=null; 
      Date time=null; 
      DateFormat df=new SimpleDateFormat("yyyy-MM-dd"); 
      DateFormat df1=new SimpleDateFormat("hh:mm:ss"); 
      try { 
       dob=df.parse("2014-02-10"); 
       time=df1.parse("11:15:00"); 
      } catch (ParseException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      System.out.println(" Date = " + dob); 
      System.out.println(" Time = " + time); 

      GregorianCalendar cal = new GregorianCalendar(); 
      GregorianCalendar cal1 = new GregorianCalendar(); 
      try { 
       cal.setTime(df.parse("2014-02-10")); 
       cal1.setTime(df1.parse("11:15:00")); 
      } catch (ParseException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      XMLGregorianCalendar xmlDate = null; 
      XMLGregorianCalendar xmlDate1 = null; 
      try { 
       xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED); 
       xmlDate1 = DatatypeFactory.newInstance().newXMLGregorianCalendarTime(cal1.get(Calendar.HOUR),cal1.get(Calendar.MINUTE),cal.get(Calendar.SECOND), DatatypeConstants.FIELD_UNDEFINED); 
      } catch (DatatypeConfigurationException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      System.out.println(" Before Converting - Date " + xmlDate); 
      System.out.println(" Before Converting - Time " + xmlDate1); 

      Data data = new Data(); 
      data.setDate(xmlDate); 
      data.setTime(xmlDate1); 



      ObjectMapper mapper = new ObjectMapper(); 
      try { 
       mapper.addMixIn(Data.class, MyMixin.class); 
       System.out.println("After Converting " + mapper.writeValueAsString(data)); 

      } catch (JsonProcessingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 


     } 


    } 


import javax.xml.datatype.XMLGregorianCalendar; 

public class Data { 

    private XMLGregorianCalendar date; 
    private XMLGregorianCalendar time; 

    public XMLGregorianCalendar getDate() { 
     return date; 
    } 
    public void setDate(XMLGregorianCalendar date) { 
     this.date = date; 
    } 
    public XMLGregorianCalendar getTime() { 
     return time; 
    } 
    public void setTime(XMLGregorianCalendar time) { 
     this.time = time; 
    } 



} 



import javax.xml.datatype.XMLGregorianCalendar; 

import com.fasterxml.jackson.annotation.JsonFormat; 

public interface MyMixin { 

    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd") 
    public XMLGregorianCalendar getDate(); 
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="HH:mm:ss") 
    public XMLGregorianCalendar getTime(); 

} 

ответ

5

Здесь

System.out.println(" Date = " + dob); 
System.out.println(" Time = " + time); 

вы печатаете Date объект, отформатированный с помощью его метода toString().

Здесь

System.out.println(" Before Converting " + xmlDate); 

вы распечатка XMLGregorianCalendar объекта, отформатированный с помощью его методы toString().

Здесь

System.out.println("After Converting " + mapper.writeValueAsString(xmlDate)); 

вы печатаете String, который представляет собой XMLGregorianCalendar преобразуется в значение JSON через преобразование ObjectMapper «s по умолчанию, который просто берет метку времени (время в Миллисекундах эпохи).

Ни одна из этих вещей не меняется.

Если вы хотите, чтобы ваши ObjectMapper сериализовали типы дат по-разному, используйте его метод ObjectMapper#setDateFormat(DateFormat) по мере необходимости.

Существует также SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, который включен по умолчанию.

+0

Thx Sotirios! Я придумал эту программу, чтобы изолировать проблему, с которой я столкнулся, как часть более крупного проекта. Я потребляю внешнюю службу и преобразовываю ее в JSON, передавая объект, возвращенный ObjectMapper. Эта большая полезная нагрузка имеет 1 элемент для даты и другой для времени, как указано выше. Я хочу вернуть дату и время в том же формате, который был получен от моей службы. Когда я использую ObjectMapper # setDateFormat(), он применяется к элементам даты и времени. Я хочу, чтобы дата была отформатирована как «MM-DD-YYY» и не нужна временная часть, и я хочу, чтобы время было «hh: mm: ss». Я обновил код –

+0

Я использовал mapper.configure (SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false), и я вижу {"date": "2014-02-10T05: 00: 00.000 + 0000", "time": "1970-01-01T16: 15: 00.000 + 0000" }. Однако мне хотелось бы {«date»: 2014-02-10, «время»: 11: 15: 00}. –

+0

@PunterVicky Вы как бы полностью изменили свой вопрос. Просто комментируйте свои поля с помощью 'JsonSerialize' и предоставляйте индивидуальный' JsonSerializer' для каждого, который пишет дату, и тот, который записывает время. –

Смежные вопросы