Parsowanie JSONa na Java LocalTime

0

Cześć. W bazie danych MySQL mam tablicę z polem Time. Kiedy pobieram JSON'a z wszystkimi rekordami z tej tabeli i próbuje parsować go na listę obiektów przy użyciu biblioteki Gson dostaję błąd

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.gson.internal.bind.ReflectiveTypeAdapterFactory (file:/C:/Users/User/IdeaProjects/RESTTest/jars/gson-2.8.2.jar) to field java.time.LocalTime.hour
WARNING: Please consider reporting this to the maintainers of com.google.gson.internal.bind.ReflectiveTypeAdapterFactory
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 63 path $[0].rideTime
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
	at com.google.gson.Gson.fromJson(Gson.java:888)
	at com.google.gson.Gson.fromJson(Gson.java:853)
	at com.google.gson.Gson.fromJson(Gson.java:802)
	at Main.requestListOfRides(Main.java:53)
	at Main.main(Main.java:25)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at com.intellij.rt.execution.application.AppMainV2.main(AppMainV2.java:131)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 63 path $[0].rideTime
	at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213)
	... 15 more

Zdaje się nie podoba mu się próba parsowania MySQL'owskiego Time na pole LocalTime w obiekcie klasy Ride. Macie może jakiś pomysł na obejście tego ? Szukałem w necie, jednak wszystko sprowadza się raczej do ręcznego parsowania, w momencie kiedy Gson robi to automatycznie i nie za bardzo jest jak mu "pomóc" w tej materii.

0

Pokaż jak wygląda ten json którego próbujesz sparsować.

0

Odpowiedz z serwera : [{"id":0,"idCityFrom":0,"idCityTo":3,"price":10.5,"rideTime":"1600"},{"id":1,"idCityFrom":0,"idCityTo":3,"price":10.5,"rideTime":"1900"},{"id":2,"idCityFrom":0,"idCityTo":3,"price":10.5,"rideTime":"2200"},{"id":3,"idCityFrom":3,"idCityTo":0,"price":11.5,"rideTime":"1600"},{"id":4,"idCityFrom":3,"idCityTo":2,"price":11.5,"rideTime":"1900"},{"id":5,"idCityFrom":3,"idCityTo":2,"price":11.5,"rideTime":"2200"}]

title

public class Ride {

    private int id;
    private int idCityFrom;
    private int idCityTo;
    private double price;
    private LocalTime rideTime;

}
3

Obawiam się że GSON nie umie sparsować takiego formatu. Jeśli używasz najnowszej wersji to może ktoś już zrobił jakiś moduł do tego, a jak nie to musisz zrobić własny deserializer.

edit: coś w stylu https://github.com/gkopff/gson-javatime-serialisers

0
Shalom napisał(a):

Obawiam się że GSON nie umie sparsować takiego formatu. Jeśli używasz najnowszej wersji to może ktoś już zrobił jakiś moduł do tego, a jak nie to musisz zrobić własny deserializer.

Oki. Dzięki

2
Shalom napisał(a):

Obawiam się że GSON nie umie sparsować takiego formatu. Jeśli używasz najnowszej wersji to może ktoś już zrobił jakiś moduł do tego, a jak nie to musisz zrobić własny deserializer.

edit: coś w stylu https://github.com/gkopff/gson-javatime-serialisers

Zgodnie ze standardem (o ile dla dżejsona to słowo jest właściwe). Nigdzie nie jest powiedziane, ze typ czasowy ma być znany,
Nawet mimo bogatszych parserów niż ustawa przewiduje.
Na wielkie szczęście wiodące parsery mają customizację.

@RezyserKinaAkcji dziel problemy, odcinaj nieistotne szczegóły. Jest jakiś JSON, jak już jest, to nieistotne skąd pochodzi.
Tym bardziej, że JSON to nie jest "mysqelowa kolumna Time" więc temat się nie zgadza. Dodał bym, że przechowywanie JSON w bazach relacyjnych to dla mnie ich dodatkowa przypadłość, a nie główna dziedzina.

0
AnyKtokolwiek napisał(a):
Shalom napisał(a):

Obawiam się że GSON nie umie sparsować takiego formatu. Jeśli używasz najnowszej wersji to może ktoś już zrobił jakiś moduł do tego, a jak nie to musisz zrobić własny deserializer.

edit: coś w stylu https://github.com/gkopff/gson-javatime-serialisers

Zgodnie ze standardem (o ile dla dżejsona to słowo jest właściwe). Nigdzie nie jest powiedziane, ze typ czasowy ma być znany,
Nawet mimo bogatszych parserów niż ustawa przewiduje.
Na wielkie szczęście wiodące parsery mają customizację.

@RezyserKinaAkcji dziel problemy, odcinaj nieistotne szczegóły. Jest jakiś JSON, jak już jest, to nieistotne skąd pochodzi.
Tym bardziej, że JSON to nie jest "mysqelowa kolumna Time" więc temat się nie zgadza. Dodał bym, że przechowywanie JSON w bazach relacyjnych to dla mnie ich dodatkowa przypadłość, a nie główna dziedzina.

Heh, nie wiem co Ci tak przeszkadza jedno zdanie wstępu obrazujące sytuacje. Już w drugim temacie mi to wspominasz. Wiele ludzi daje tu dużo dobrych rad dotyczących nie tylko samej istoty problemu, ale tez zauważa błędy w jego otoczce, wiec nie rozumiem dlaczego miałbym z tego jednego-dwóch zdań wstępu rezygnować, jeśli z reguły dostaje tez radę w stylu „czego tak robisz, nie lepiej tak i tak ?” I nie przechowuje w bazie żadnego jsona. Pobieram z bazy rekord, a wynik dostaje w postaci jsona

1 użytkowników online, w tym zalogowanych: 0, gości: 1