我有一个映射问题,使用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对象的类型吗? 或者我的构造函数中缺少某些东西?
答案 0 :(得分:1)
您应该使用日期和日历的标准ISO-8601字符串表示形式;或者,如果您想使用JSON对象,请为JsonDeserializer
类型编写自己的GregorianCalendar
。
答案 1 :(得分:1)
最后,我做了这样的事情来解决我的问题:
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;
}
}