Преобразование объекта JSON в util.ate в Java - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть объект, который выглядит так:

{
    "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. При приведении JSON к дате, как это Date now = (Date) myJsonResponse, Android Studio выдает ошибку:

Неопровержимые типы: невозможно привести JSONObject к дате

Edit. Я не могу использовать util.Date, потому что мне нужно время, чтобы прийти с сервера, чтобы он был универсальным для всех.

Ответы [ 4 ]

0 голосов
/ 12 сентября 2018

Вот что это решило.Спасибо Аюш Гупта за комментарий.

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

            try {

                JSONObject jsonObject = new JSONObject(response);

                timestamp = jsonObject.getLong("time");

                lastLoadedDate = new Date(timestamp);

            } catch (JSONException e) {
                //Handle the exception
            }

        }
    }
0 голосов
/ 12 сентября 2018

Вы можете сгенерировать его самостоятельно, если хотите использовать утилиту Java. Дата.

В документации вы можете найти правильное объявление конструктора как 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));
0 голосов
/ 12 сентября 2018

Сначала вы создаете класс 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);

Надеюсь, это поможет вам.

0 голосов
/ 12 сентября 2018

Если возможно, пусть сервер вернет дату в лучшем формате, таком как ISO-8601 , поскольку это позволит избежать двусмысленности и приведет к уменьшению полезной нагрузки JSON.

Если это невозможновам придется решить, какие части JSON использовать, либо time, либо различные значения, такие как hours, minutes, ... Выбрав эти части вручную, вы можете построить объект Dateвручную, используя один из его конструкторов или через объект java.util.Calendar (поскольку многие конструкторы в java.util.Date устарели в Java 8).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...