在Java中将JSON对象转换为util.Date

时间:2018-09-12 12:49:30

标签: java android json date time

我有一个看起来像这样的对象:

{
    "date": 12,
    "day": 3,
    "hours": 12,
    "minutes": 32,
    "month": 8,
    "seconds": 32,
    "time": 1536755552909,
    "timezoneOffset": 0,
    "year": 118
}

我之前使用util.Date生成日期,但是现在我从Node.js服务器以上面的格式获取日期。如何将其转换为Date类型?

当我尝试做

StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

            JsonParser jsonParser = new JsonParser();
            JsonElement jsonElement = jsonParser.parse(response);
            Gson gson = new Gson();
            Date date = gson.fromJson(jsonElement,Date.class);

            lastLoadedDate = date;

            elapsedTime = 0;

        }
    }

这只是失败,因为它不是字符串,Node服务器发送JSON。如果我做new Response.Listener<Date>()是因为它是JSON,而不是日期。将Date now = (Date) myJsonResponse这样的JSON转换为Date会导致Android Studio错误提示:

  

不可逆类型:无法将JSONObject强制转换为Date

编辑。我不能使用util.Date,因为我需要时间从服务器来,这对每个人来说都是通用的。

4 个答案:

答案 0 :(得分:2)

如果可能,请让服务器以更好的格式(例如ISO-8601)返回日期,因为这样可以避免歧义,并减小JSON负载。

如果无法实现,则必须决定使用JSON的哪些部分,timehoursminutes等不同的值,...手动挑选这些部分,您可以使用其构造函数之一或通过Date对象手动构建java.util.Calendar对象(因为Java 8中已弃用java.util.Date中的许多构造函数)。

答案 1 :(得分:1)

这是解决问题的方法。谢谢Ayush Gupta的评论。

variant

答案 2 :(得分:0)

如果要使用Java的util.Date,则可以自己生成它。

documentation中,您可以找到正确的构造方法声明为Date(int year, int month, int date, int hrs, int min, int sec)

因此您可以从json创建它,只需从中获取适当的值(以指定json对象的方式->在我的示例中,它是一个Object):

Date date = new Date(jsonElement.get(year), jsonElement.get(month), jsonElement.get(date), jsonElement.get(hrs), jsonElement.get(min), jsonElement.get(sec));

答案 3 :(得分:0)

首先,您创建一个像这样的POJO类。

    public class ResponseModel {

    private int date;
    private int day;
    private int hours;
    private int minutes;
    private int month;
    private int seconds;
    private long time;
    private int timezoneOffset;
    private int year;

    public int getDate() {
        return date;
    }

    public ResponseModel setDate(int date) {
        this.date = date;
        return this;
    }

    public int getDay() {
        return day;
    }

    public ResponseModel setDay(int day) {
        this.day = day;
        return this;
    }

    public int getHours() {
        return hours;
    }

    public ResponseModel setHours(int hours) {
        this.hours = hours;
        return this;
    }

    public int getMinutes() {
        return minutes;
    }

    public ResponseModel setMinutes(int minutes) {
        this.minutes = minutes;
        return this;
    }

    public int getMonth() {
        return month;
    }

    public ResponseModel setMonth(int month) {
        this.month = month;
        return this;
    }

    public int getSeconds() {
        return seconds;
    }

    public ResponseModel setSeconds(int seconds) {
        this.seconds = seconds;
        return this;
    }

    public long getTime() {
        return time;
    }

    public ResponseModel setTime(long time) {
        this.time = time;
        return this;
    }

    public int getTimezoneOffset() {
        return timezoneOffset;
    }

    public ResponseModel setTimezoneOffset(int timezoneOffset) {
        this.timezoneOffset = timezoneOffset;
        return this;
    }

    public int getYear() {
        return year;
    }

    public ResponseModel setYear(int year) {
        this.year = year;
        return this;
    }
}

然后将您的字符串响应转换为ResponseModel.class

Gson gson = new Gson();
ResponseModel model = gson.fromJson(jsonElement,ResponseModel.class);

然后创建如下所示的方法

private Date getDateFromResponse(ResponseModel model) {
        Calendar calendar = Calendar.getInstance();

        //-----
        calendar.set(Calendar.DAY_OF_MONTH, model.getDate());
        calendar.set(Calendar.MONTH, model.getMonth());
        calendar.set(Calendar.YEAR, model.getYear());
        calendar.set(Calendar.HOUR, model.getHours());
        calendar.set(Calendar.MINUTE, model.getMinutes());
        calendar.set(Calendar.SECOND, model.getSeconds());

        //OR
        //You can simply add this line with this time is equal to your all fields
        //And comment all above lines.
        //calendar.setTimeInMillis(model.getTime());

        return calendar.getTime();

    }

,只需调用此方法即可。

Date date = getDateFromResponse(model);

希望这对您有所帮助。