【发布时间】:2017-04-17 06:41:59
【问题描述】:
我有一个在 Java Web 服务器 (Jersey Jax RS RI 2.13) 上运行的 HTTP REST API,它为我提供了使用 Jackson 序列化的 AssetBooking 对象的 ArrayList。在 Android 端,我有相同的对象,我用 Gson 反序列化。
所有其他对象都可以正常反序列化,AssetBooking 对象的其他字段也可以正常反序列化...
这是我的反序列化方法:
public ArrayList<AssetBooking> getAssetBookings (String json) {
Gson gson = new Gson();
ArrayList<AssetBooking> assetBookings = gson.fromJson(json, new TypeToken<ArrayList<AssetBooking>>(){}.getType());
return assetBookings;
}
问题是我的 Joda Time LocalDateTime 字段使用当前时间戳进行反序列化,而不是使用我从服务器传递的日期(在 JSON 字符串中是正确的)进行反序列化。
您知道问题的可能原因吗?
资产预订.java
import org.joda.time.*;
public class AssetBooking {
protected int id;
protected int assetId;
protected int userId;
protected LocalDateTime fromDatetime;
protected LocalDateTime toDatetime;
protected boolean status;
protected LocalDateTime createdOn;
protected LocalDateTime updatedOn;
protected String userName;
protected String userLastName;
protected String userEmail;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAssetId() {
return assetId;
}
public void setAssetId(int assetId) {
this.assetId = assetId;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public LocalDateTime getFromDatetime() {
return fromDatetime;
}
public void setFromDatetime(LocalDateTime fromDatetime) {
this.fromDatetime = fromDatetime;
}
public LocalDateTime getToDatetime() {
return toDatetime;
}
public void setToDatetime(LocalDateTime toDatetime) {
this.toDatetime = toDatetime;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public LocalDateTime getCreatedOn() {
return createdOn;
}
public void setCreatedOn(LocalDateTime createdOn) {
this.createdOn = createdOn;
}
public LocalDateTime getUpdatedOn() {
return updatedOn;
}
public void setUpdatedOn(LocalDateTime updatedOn) {
this.updatedOn = updatedOn;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserLastName() {
return userLastName;
}
public void setUserLastName(String userLastName) {
this.userLastName = userLastName;
}
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
}
在 Android 端收到的 JSON 字符串(它只有一个对象,但我必须删除日期变量 createdOn 和 updatedOn,以免超过 StackOverflow 的最大帖子大小):
[
{
"id": 0,
"assetId": 1,
"userId": 1,
"fromDatetime": {
"year": 2017,
"dayOfMonth": 12,
"dayOfWeek": 1,
"era": 1,
"dayOfYear": 163,
"chronology": {
"zone": {
"fixed": true,
"id": "UTC"
}
},
"centuryOfEra": 20,
"yearOfEra": 2017,
"yearOfCentury": 17,
"weekyear": 2017,
"monthOfYear": 6,
"weekOfWeekyear": 24,
"hourOfDay": 13,
"minuteOfHour": 14,
"secondOfMinute": 15,
"millisOfSecond": 0,
"millisOfDay": 47655000,
"fields": [
{
"lenient": false,
"minimumValue": -292275054,
"maximumValue": 292278993,
"leapDurationField": {
"precise": true,
"unitMillis": 86400000,
"name": "days",
"type": {
"name": "days"
},
"supported": true
},
"rangeDurationField": null,
"durationField": {
"precise": false,
"unitMillis": 31556952000,
"name": "years",
"type": {
"name": "years"
},
"supported": true
},
"name": "year",
"type": {
"durationType": {
"name": "years"
},
"rangeDurationType": null,
"name": "year"
},
"supported": true
},
{
"lenient": false,
"minimumValue": 1,
"maximumValue": 12,
"leapDurationField": {
"precise": true,
"unitMillis": 86400000,
"name": "days",
"type": {
"name": "days"
},
"supported": true
},
"rangeDurationField": {
"precise": false,
"unitMillis": 31556952000,
"name": "years",
"type": {
"name": "years"
},
"supported": true
},
"durationField": {
"precise": false,
"unitMillis": 2629746000,
"name": "months",
"type": {
"name": "months"
},
"supported": true
},
"name": "monthOfYear",
"type": {
"durationType": {
"name": "months"
},
"rangeDurationType": {
"name": "years"
},
"name": "monthOfYear"
},
"supported": true
},
{
"minimumValue": 1,
"maximumValue": 31,
"rangeDurationField": {
"precise": false,
"unitMillis": 2629746000,
"name": "months",
"type": {
"name": "months"
},
"supported": true
},
"lenient": false,
"durationField": {
"precise": true,
"unitMillis": 86400000,
"name": "days",
"type": {
"name": "days"
},
"supported": true
},
"unitMillis": 86400000,
"name": "dayOfMonth",
"type": {
"durationType": {
"name": "days"
},
"rangeDurationType": {
"name": "months"
},
"name": "dayOfMonth"
},
"supported": true,
"leapDurationField": null
},
{
"maximumValue": 86399999,
"range": 86400000,
"rangeDurationField": {
"precise": true,
"unitMillis": 86400000,
"name": "days",
"type": {
"name": "days"
},
"supported": true
},
"lenient": false,
"durationField": {
"name": "millis",
"type": {
"name": "millis"
},
"supported": true,
"precise": true,
"unitMillis": 1
},
"minimumValue": 0,
"unitMillis": 1,
"name": "millisOfDay",
"type": {
"durationType": {
"name": "millis"
},
"rangeDurationType": {
"name": "days"
},
"name": "millisOfDay"
},
"supported": true,
"leapDurationField": null
}
],
"values": [
2017,
6,
12,
47655000
],
"fieldTypes": [
{
"durationType": {
"name": "years"
},
"rangeDurationType": null,
"name": "year"
},
{
"durationType": {
"name": "months"
},
"rangeDurationType": {
"name": "years"
},
"name": "monthOfYear"
},
{
"durationType": {
"name": "days"
},
"rangeDurationType": {
"name": "months"
},
"name": "dayOfMonth"
},
{
"durationType": {
"name": "millis"
},
"rangeDurationType": {
"name": "days"
},
"name": "millisOfDay"
}
]
},
"toDatetime": {
"year": 2017,
"dayOfMonth": 13,
"dayOfWeek": 4,
"era": 1,
"dayOfYear": 194,
"chronology": {
"zone": {
"fixed": true,
"id": "UTC"
}
},
"centuryOfEra": 20,
"yearOfEra": 2017,
"yearOfCentury": 17,
"weekyear": 2017,
"monthOfYear": 7,
"weekOfWeekyear": 28,
"hourOfDay": 14,
"minuteOfHour": 15,
"secondOfMinute": 16,
"millisOfSecond": 0,
"millisOfDay": 51316000,
"fields": [
{
"lenient": false,
"minimumValue": -292275054,
"maximumValue": 292278993,
"leapDurationField": {
"precise": true,
"unitMillis": 86400000,
"name": "days",
"type": {
"name": "days"
},
"supported": true
},
"rangeDurationField": null,
"durationField": {
"precise": false,
"unitMillis": 31556952000,
"name": "years",
"type": {
"name": "years"
},
"supported": true
},
"name": "year",
"type": {
"durationType": {
"name": "years"
},
"rangeDurationType": null,
"name": "year"
},
"supported": true
},
{
"lenient": false,
"minimumValue": 1,
"maximumValue": 12,
"leapDurationField": {
"precise": true,
"unitMillis": 86400000,
"name": "days",
"type": {
"name": "days"
},
"supported": true
},
"rangeDurationField": {
"precise": false,
"unitMillis": 31556952000,
"name": "years",
"type": {
"name": "years"
},
"supported": true
},
"durationField": {
"precise": false,
"unitMillis": 2629746000,
"name": "months",
"type": {
"name": "months"
},
"supported": true
},
"name": "monthOfYear",
"type": {
"durationType": {
"name": "months"
},
"rangeDurationType": {
"name": "years"
},
"name": "monthOfYear"
},
"supported": true
},
{
"minimumValue": 1,
"maximumValue": 31,
"rangeDurationField": {
"precise": false,
"unitMillis": 2629746000,
"name": "months",
"type": {
"name": "months"
},
"supported": true
},
"lenient": false,
"durationField": {
"precise": true,
"unitMillis": 86400000,
"name": "days",
"type": {
"name": "days"
},
"supported": true
},
"unitMillis": 86400000,
"name": "dayOfMonth",
"type": {
"durationType": {
"name": "days"
},
"rangeDurationType": {
"name": "months"
},
"name": "dayOfMonth"
},
"supported": true,
"leapDurationField": null
},
{
"maximumValue": 86399999,
"range": 86400000,
"rangeDurationField": {
"precise": true,
"unitMillis": 86400000,
"name": "days",
"type": {
"name": "days"
},
"supported": true
},
"lenient": false,
"durationField": {
"name": "millis",
"type": {
"name": "millis"
},
"supported": true,
"precise": true,
"unitMillis": 1
},
"minimumValue": 0,
"unitMillis": 1,
"name": "millisOfDay",
"type": {
"durationType": {
"name": "millis"
},
"rangeDurationType": {
"name": "days"
},
"name": "millisOfDay"
},
"supported": true,
"leapDurationField": null
}
],
"values": [
2017,
7,
13,
51316000
],
"fieldTypes": [
{
"durationType": {
"name": "years"
},
"rangeDurationType": null,
"name": "year"
},
{
"durationType": {
"name": "months"
},
"rangeDurationType": {
"name": "years"
},
"name": "monthOfYear"
},
{
"durationType": {
"name": "days"
},
"rangeDurationType": {
"name": "months"
},
"name": "dayOfMonth"
},
{
"durationType": {
"name": "millis"
},
"rangeDurationType": {
"name": "days"
},
"name": "millisOfDay"
}
]
},
"status": true,
"userName": "Fabio",
"userLastName": "Lanza",
"userEmail": "fabio@blabla.bla"
}
]
作为一个实验,我在反序列化后序列化了对象(而不是数组)并得到了以下结果:
{
"assetId": 1,
"createdOn": {
"iChronology": {
"iBase": {
"iMinDaysInFirstWeek": 4
}
},
"iLocalMillis": 1492419018809
},
"fromDatetime": {
"iChronology": {
"iBase": {
"iMinDaysInFirstWeek": 4
}
},
"iLocalMillis": 1492419014536
},
"id": 0,
"status": true,
"toDatetime": {
"iChronology": {
"iBase": {
"iMinDaysInFirstWeek": 4
}
},
"iLocalMillis": 1492419018793
},
"updatedOn": {
"iChronology": {
"iBase": {
"iMinDaysInFirstWeek": 4
}
},
"iLocalMillis": 1492419018831
},
"userEmail": "fabio@blabla.bla",
"userId": 1,
"userLastName": "Lanza",
"userName": "Fabio"
}
【问题讨论】:
标签: java android jackson gson jodatime