Json DateTime object to GregorianCalendar


Json DateTime object to GregorianCalendar

我有一个使用jackson库将Json API回调转换为自定义对象的映射问题。

我有我的用户自定义类:

public class User {
    protected String id;
    protected GregorianCalendar registredAt;
    protected String username;
    protected Team team;
    public User() {
    }
    public User(String id, GregorianCalendar registredAt, String username, Team team) {
        this.id = id;
        this.registredAt = registredAt;
        this.username = username;
        this.team = team;
    }
    public User(HashMap<String, Object> attributes) {
        this.id = (String) attributes.get("id");
        this.registredAt = (GregorianCalendar) attributes.get("registredAt");
        this.username = (String) attributes.get("username");
        this.team = (Team) attributes.get("team");
    }
}

这是我的回拨:

{
    id: "4feab37c5600bbd56f000132",
    registredAt: {
        date: "2012-06-27 09:17:15",
        timezone_type: 3,
        timezone: "Europe/Paris"
    },
    username: "John Doe",
    team: {
        id: "4feab37c5600bbd56f000130",
        indice: 1,
        name: "John Doe's Team",
        score: 200
    }
}

然后,我尝试初始化一个User对象:

// Code from a doInBackground() method of a custom AsyncTask.
URL completePath = new URL(apiBaseURL + "api/user/4feab37c5600bbd56f000132/show");
APIconnection = (HttpURLConnection) completePath.openConnection();
APIconnection.setDoInput(true);
APIconnection.connect();
callbackParser = jsonFactory.createJsonParser(APIconnection.getInputStream());
response = objectMapper.readValue(callbackParser, User.class);
// Catch a JsonMappingException :
Can not deserialize instance of java.util.Calendar out of START_OBJECT token at [Source: org.apache.harmony.luni.internal.net.www.protocol.http.FixedLengthInputStream@4082c7a0; line: 1, column: 33] (through reference chain: classes.models.User["registredAt"])

我认为问题是回调registredAt对象是一个json_encoded PHP''DateTime实例。。。我应该更改registredAt Java User对象的类型吗?或者我的构造函数中缺少什么?

您应该使用标准的ISO-8601日期和日历字符串表示;或者,如果要使用JSON对象,请为GregorianCalendar类型编写自己的JsonDeserializer

最后,我做了这样的事情来解决我的问题:

public User(HashMap<String, Object> attributes) {
    this.id = (String) attributes.get("id");
    HashMap <String, Object> registredAt = (HashMap<String, Object>) attributes.get("registredAt");
    IMDateFormatter formatter = new IMDateFormatter();
    this.registredAt = formatter.getCalendarFromJson((String) registredAt.get("date"));
    [...]
}

和IMDateFormatter以一种简单的方式格式化我的日期:

public class IMDateFormatter extends DateFormat {
    public IMDateFormatter() {
    }
    @Override
    public StringBuffer format(Date arg0, StringBuffer arg1, FieldPosition arg2) {
        return null;
    }
    @Override
    public Date parse(String dateFromJson, ParsePosition arg1) {
        return null;
    }
    public GregorianCalendar getCalendarFromJson(String dateFromJson) {
        GregorianCalendar calendarFromJson = null;
        try {
            GregorianCalendar tmpCalendar = new GregorianCalendar();
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.FRANCE);
            tmpCalendar.setTime(df.parse(dateFromJson));
            calendarFromJson = tmpCalendar;
        }
        catch (NullPointerException NPE) {
            NPE.printStackTrace();
        }
        catch (ParseException PE) {
            PE.printStackTrace();
        }
        return calendarFromJson;
    }
}