当前位置: 首页 > 知识库问答 >
问题:

转换为JSON-Jackson库后保留XMLGregorianCalendar日期格式

芮岳
2023-03-14

我有一个对象,它有2个XMLGregorianCalendar对象--一个用于日期,另一个用于时间。我使用Jackson对象映射器将日期转换为JSON格式。转换前日期为2014-02-10&时间为11:15:00。转换为JSON后,它变为{“Date”:1392008400000,“Time”:58500000}。在用JSON打印后,如何保留相同的日期和时间格式({“日期”:2014-02-10,“时间”:11:15:00})。.

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;
    }



}

工作代码(带有mixin)

    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();

}

共有1个答案

叶阳
2023-03-14

这里

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

您正在打印通过其ToString()方法格式化的Date对象。

这里

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

如果希望ObjectMapper以不同的方式序列化日期类型,请根据需要使用其ObjectMapper#setDateFormat(DateFormat)方法。

还有serializationfeature.write_dates_as_timestamps,它默认启用。

 类似资料:
  • 请帮助更改日期格式。 **源**json文件 **目标**员工对象 我需要支持将文件json日期转换为对象。来自文件 对象 对象 库“com.fasterxml.jackson.datatype:jackson-datatype-jsr310” 日期:<代码>java。时间本地日期 我的目标是从文件中读取json数据并将其映射到对象。

  • 问题内容: 我正在使用需要json日期格式的API。 我需要转换我的JavaScript日期 1970年1月17日星期六格林尼治标准时间+0100(浪漫标准时间) 以json日期格式 /日期(1405699200)/ 问题答案: 列各项可以吗?

  • 问题内容: 我收到的日期值是这样的JSON对象: 我想用Java代码将其解析为或作为。 我想知道什么是简单的方法。 问题答案: 我认为第一个数字()是自纪元以来的毫秒数,并且是时区。鉴于以下示例代码似乎是这种情况,它似乎可以满足您的要求。 以下代码使用Jackson解析JSON输入,如果您还没有选择的JSON解析库,我建议您这样做。它缺少错误检查等。 样例代码: 输出:

  • 我使用JAXB对从服务器获得的XML消息进行UN/Marshing处理。通常,我在字段中获取XMLGregorianCalendar值,这些字段在描述XSD文件中被defind为xs:datetime,因此到XMLGregorianCalendar的转换是由JAXB自动完成的。

  • 问题内容: 在测试可在系统之间映射日期时间类型的Web服务时,我注意到在公历开始时间之前发送任何日期会导致转换为最终类型时准确性下降,最终结果总是在该范围内稍早几天。 我将问题缩小到确切的范围,但是我仍然无法弄清 为什么 要这样进行转换,从文档中可以看出,儒略历用于公历开始前的日期时间:1582年10月15日。 问题行位于从开始到第78行: 当时间从第86行开始时:时间比原定时间提前了2天,即1月

  • 问题内容: 我已经写了这个功能: 当我通过日期以及获取输出日期作为 我要去哪里的时候?还做什么,如果我想只得到和 任何帮助表示赞赏 问题答案: 找到以下解决方案…。发布它,因为它也可以帮助其他人:) 输出: 2014-04-24T11:15:00.000 + 02:00