Форматировать поля даты в строку в XStream - PullRequest
5 голосов
/ 13 февраля 2012

У меня есть поле даты, которое при преобразовании в xml с использованием XStream дает время в миллисекундах и зоне. Мне просто нужно конвертировать или отформатировать как "MMMM dd, yyyy HH:mm:ss". Как это сделать с помощью XStream? Я не хочу менять геттеры и сеттеры. Спасибо.

Мой класс:

    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>

Я бы хотел отформатировать тег dob без изменения методов получения и установки. Спасибо.

Ответы [ 3 ]

9 голосов
/ 04 сентября 2013

Самый простой способ - зарегистрировать (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 голосов
/ 13 февраля 2012

Пользовательский преобразователь для полей 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 будет искать поля календаря ибудет маршалловым, как определено в Custom Converter.

0 голосов
/ 13 февраля 2012

Вы должны использовать пользовательский конвертер, в котором по методу маршала измените свой формат даты по своему желанию.
Это должно быть сделано после узла DOB.
Я не думаю, что вам нужно что-то делать в демаршале.
Удачи:)

...