Исключение GSON при разборе временной метки - PullRequest
1 голос
/ 16 июня 2019

Мое приложение не может проанализировать ответ API REST из-за формата отметки времени.REST API возвращает JSON:

   {
        "id": 4,
        "username": "test555",
        "email": "test555@test.com",
        "password": "pass",
        "role": "USER",
        "enabled": 1,
        "lastPassChange": null,
        "created": [2019, 6, 16, 19, 8, 34, 843438000]
    }

Но мое приложение выдает исключение, потому что оно ожидает объект, но получает массив.

Я добавил реализацию 'com.fatboyindustrial.gson-jodatime-serialisers:gson-jodatime-serialisers:1.7.0'

и добавил вмой gson singleton:

public class GsonSingleton {
    private static GsonSingleton sInstace;
    private Gson gson;

    public static synchronized GsonSingleton getInstance(){
        if(sInstace == null){
            sInstace = new GsonSingleton();
        }
        return sInstace;
    }

    private GsonSingleton(){
        this.gson = Converters.registerLocalDateTime(new GsonBuilder()).create();
    }

    public Gson gson(){
        return this.gson;
    }

    public JSONObject obj2Json(Object o) throws JSONException{
        return new JSONObject(gson.toJson(o));
    }
} 

но это не помогает.

Строка, в которой возникают исключения:

User savedUser = GsonSingleton.getInstance().gson().fromJson(response.toString(), User.class);

Стек исключений:

`com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 191 path $.created
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
    at com.google.gson.Gson.fromJson(Gson.java:927)
    at com.google.gson.Gson.fromJson(Gson.java:892)
    at com.google.gson.Gson.fromJson(Gson.java:841)
    at com.google.gson.Gson.fromJson(Gson.java:813)
    at eu.blubit.autobook.view.AccountFormActivity$1.onResponse(AccountFormActivity.java:153)
    at eu.blubit.autobook.view.AccountFormActivity$1.onResponse(AccountFormActivity.java:148)
    at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:90)
    at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6816)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1563)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1451)
 Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 191 path $.created
    at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:215)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222) 
    at com.google.gson.Gson.fromJson(Gson.java:927) 
    at com.google.gson.Gson.fromJson(Gson.java:892) 
    at com.google.gson.Gson.fromJson(Gson.java:841) 
    at com.google.gson.Gson.fromJson(Gson.java:813) 
    at eu.blubit.autobook.view.AccountFormActivity$1.onResponse(AccountFormActivity.java:153) 
    at eu.blubit.autobook.view.AccountFormActivity$1.onResponse(AccountFormActivity.java:148) 
    at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:90) 
    at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102) 
    at android.os.Handler.handleCallback(Handler.java:751) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6816) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1563) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1451)`

Но я должен получить объект User.class:

@Entity
public class User {

@PrimaryKey
@NonNull
private Long id;

@Size(min=3, max=20)
private String username;

private String email;

@Size(min=6)
private String password;

private String role;

private Integer enabled;

private LocalDateTime lastPassChange;

private LocalDateTime created;
//setters and getters

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Я нашел другой способ, который работает для меня.Я добавил новый класс в мой синглтон, который является десериализатором для json.

public class JsonDateTimeArrayDeserializer implements JsonDeserializer<LocalDateTime>{
    @Override
    public LocalDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonArray jArr = json.getAsJsonArray();
        return LocalDateTime.of(jArr.get(0).getAsInt(), jArr.get(1).getAsInt(), jArr.get(2).getAsInt(), jArr.get(3).getAsInt(), jArr.get(4).getAsInt(), jArr.get(5).getAsInt(), jArr.get(6).getAsInt());
    }
}

И мне пришлось зарегистрировать его в private GsonSingleton():

this.gson = new GsonBuilder.registerTypeAdapter(LocalDateTime.class, new JsonDateTimeArrayDeserializer()).create
0 голосов
/ 16 июня 2019

Попробуйте это как конвертер:

Gson gson = new GsonBuilder().setDateFormat("[YYYY,  MM, dd, HH, mm, ss, SSSSSSSSS]").create();
Converters.registerLocalDateTime(gson).create();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...