Форматировать поля даты в строку в XStream
У меня есть поле даты, которое при преобразовании в 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 ответа
Пользовательский конвертер для 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.
Самый простой способ - зарегистрировать (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));
Это работает для меня, и мне не нужно было создавать новый класс конвертера.
Вы должны использовать пользовательский конвертер, в котором в соответствии с методом маршала измените свой формат даты, как вы хотите.
Это должно быть сделано после узла DOB.
Я не думаю, что вам нужно что-то делать в некоммерческом методе.
Удачи:)