JAX-RS JSON java.util.Date Unmarshall - PullRequest
       17

JAX-RS JSON java.util.Date Unmarshall

7 голосов
/ 16 июня 2010

Я использую Jersey (jax-rs) для создания приложения, обогащенного REST.

Все отлично, но я не совсем понимаю, как настроить параметры JSON Marshalling / Unmarshalling для дат ичисла.

У меня есть класс пользователя:

@XmlRootElement
public class User {
    private String username;
    private String password;
    private java.util.Date createdOn;

    // ... getters and setters
}

Когда свойство createdOn сериализуется, я получаю строку, подобную этой: '2010-05-12T00: 00: 00+02:00 ', но мне нужно использовать определенный шаблон дат, как для маршалловых, так и для маршалловых дат.

Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

16 голосов
/ 13 июля 2010

Вы можете написать XmlAdapter:

Ваш конкретный XmlAdapter будет выглядеть примерно так:

import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class JsonDateAdapter extends XmlAdapter<String, Date> {

    @Override
    public Date unmarshal(String v) throws Exception {
        // TODO convert from your format
    }

    @Override
    public String marshal(Date v) throws Exception {
        // TODO convert to your format
    }

}

Тогда на вашемСвойство date устанавливает следующую аннотацию:

@XmlJavaTypeAdapter(JsonDateAdapter.class)
public getDate() {
   return date;
}
2 голосов
/ 16 июня 2010

То, что вы получаете, является форматом даты ISO 8601, который является стандартом. Джерси проанализирует это для вас на сервере. Для javascript здесь есть расширение до даты js для его анализа.

Обновление Ссылка не работает: попробуйте другой синтаксический анализатор, см. Справка по разбору даты ISO 8601 в Javascript

1 голос
/ 19 января 2011

Если вы не хотите играть с адаптерами или вам нужно настраивать сортировку для различных объектов и вы хотите вообще избегать адаптеров, вы также можете поиграть с атрибутами и шаблоном бина:

private Date startDate;

@XmlTransient
public Date getStartDate() {
    return startDate;
}
public void setStartDate(Date startDate) {
    this.startDate = startDate;
}
@XmlElement public String getStrStartDate() {
    if (startDate == null) return null;
    return "the string"; // the date converted to the format of your choice with a DateFormatter";
}
public void setStrStartDate(String strStartDate) throws Exception {
    this.startDate = theDate; // the strStartDate converted to the a Date from the format of your choice with a DateFormatter;
}
...