在XStream中将日期字段格式化为字符串

6

我有一个日期字段,使用XStream转换为xml时,会给出毫秒和时区。 我只需要将其转换或格式化为"MMMM dd, yyyy HH:mm:ss"。如何使用XStream实现? 我不想改变getter和setter。谢谢。

我的类:

    public class Datas {
    private String name;
    private Calendar dob;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Calendar getDob() {
        return dob;
    }

    public void setDob(Calendar dob) {
        this.dob = dob;
    }

    public static void main(String[] args) {
        Datas datas = new Datas();
        datas.setName("Ahamed");
        datas.setDob(Calendar.getInstance());
        XStream stream = new XStream();
        System.out.println(stream.toXML(datas));
    }
}

输出:

<Datas>
  <name>Ahamed</name>
  <dob>
    <time>1329081818801</time>
    <timezone>Asia/Calcutta</timezone>
  </dob>
</Datas>

我希望能够在不改变getter和setter的情况下格式化dob标签。谢谢。


巨大的 XML 是什么意思?我们可以举个例子吗? - Peter Svensson
1
请查看XStream - 转换器教程。其中有关于日期转换的部分。 - mre
3个回答

12

一种简单的方法是注册一个 (XStream!) DateConverter 并使用相应的格式,例如:

import com.thoughtworks.xstream.converters.basic.DateConverter;

XStream xstream = new XStream();
String dateFormat = "yyyyMMdd";
String timeFormat = "HHmmss";
String[] acceptableFormats = {timeFormat};
xstream.registerConverter(new DateConverter(dateFormat, acceptableFormats));

这对我很有效,我不需要创建一个新的转换器类。


5

Calendar字段的自定义转换器:

public class DateConverter implements Converter {

    private SimpleDateFormat formatter = new SimpleDateFormat(
            "MMMM dd, yyyy HH:mm:ss");

    public boolean canConvert(Class clazz) {
        // This converter is only for Calendar fields.
        return Calendar.class.isAssignableFrom(clazz);
    }

    public void marshal(Object value, HierarchicalStreamWriter writer,
            MarshallingContext context) {
        Calendar calendar = (Calendar) value;
        Date date = calendar.getTime();
        writer.setValue(formatter.format(date));
    }

    public Object unmarshal(HierarchicalStreamReader reader,
            UnmarshallingContext context) {
        GregorianCalendar calendar = new GregorianCalendar();
        try {
            calendar.setTime(formatter.parse(reader.getValue()));
        } catch (ParseException e) {
            throw new ConversionException(e.getMessage(), e);
        }
        return calendar;
    }
}

将上述转换器注册到XStream对象中,方法如下:
XStream xStream = new XStream();
xStream.registerConverter(new DateConverter());

现在,xStream对象将查找日历字段,并根据自定义转换器中定义的方式进行编组。

1
请注意:SimpleDateFormat 不是线程安全的。最简单的解决方法是每次需要时构造一个新的 SDF。 - Frederic Leitenberger

0

你需要使用自定义转换器,在marshal方法下修改你想要的日期格式。
这应该在DOB节点之后完成。
我认为你不需要在unmarshal方法中做任何事情。
祝你好运 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接