GSON десериализован для типа метки времени - PullRequest
0 голосов
/ 03 января 2019

Я хочу десериализовать метку времени, используя gson в java.

// simple class what I want to serialize and deserialize 
public class TestTime {

    private Timestamp time;

}

// and I create gson and try to deserialize it
String body = request.getReader().lines().collect(Collectors.joining());        
TestTime data = gson.fromJson(body, TestTime .class);

// my test data in response body 
{"time": 1546476882}

Однако я получил это исключение.

com.google.gson.JsonSyntaxException: 1546476882
    at com.google.gson.DefaultDateTypeAdapter.deserializeToDate(DefaultDateTypeAdapter.java:107)
    at com.google.gson.DefaultDateTypeAdapter.deserialize(DefaultDateTypeAdapter.java:82)
    at com.google.gson.DefaultDateTypeAdapter.deserialize(DefaultDateTypeAdapter.java:35)
    at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
    at com.google.gson.Gson.fromJson(Gson.java:803)
    at com.google.gson.Gson.fromJson(Gson.java:768)
    at com.google.gson.Gson.fromJson(Gson.java:717)
    at com.google.gson.Gson.fromJson(Gson.java:689)

Как я могу долго десериализовать метку времени, например 1546476882?

1 Ответ

0 голосов
/ 04 января 2019

Как уже заметил @johnheroy, вам нужно TypeAdapter для адаптации между Timestamp объектами и long значениями (очевидно, у вас есть секунды с 1970-01-01, эпоха Unix).

Этот адаптер будет очень простым

public class TimestampAdapter extends TypeAdapter<Timestamp> {

    @Override
    public Timestamp read(JsonReader in) throws IOException {
        return new Timestamp(in.nextLong() * 1000);  // convert seconds to milliseconds
    }

    @Override
    public void write(JsonWriter out, Timestamp timestamp) throws IOException {
        out.value(timestamp.getTime() / 1000);  // convert milliseconds to seconds
    }
}

Вам нужно зарегистрировать этот адаптер в Gson следующим образом:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Timestamp.class, new TimestampAdapter())
        .create();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...