Czy istnieje sposób w Gson, aby zmapować wiele pól JSON na jedną zmienną składową obiektu Java?
Powiedzmy, że mam klasę Java ...
public class MyClass {
String id;
String name;
}
Chcę używać tej jednej klasy z dwoma różnymi usługami. Jednak te dwie usługi różnią się sposobem, w jaki zwracają swoje dane ...
{ "id": 2341, "person": "Bob" }
... i ...
{ "id": 5382, "user": "Mary" }
... odpowiednio.
Czy istnieje sposób odwzorowania pól "person"
i "user"
w ciągu JSON na name
pole w obiekcie Java?
(Uwaga: potrzebuję tylko konwersji z ciągu JSON na obiekt Java - nigdy na odwrót.)
Odpowiedzi:
W październiku 2015 r. W wersji 2.4 Gson ( dziennik zmian ) dodano możliwość używania alternatywnych / wielu nazw
@SerializedName
podczas deserializacji. Nie potrzeba więcej niestandardowego TypeAdapter!Stosowanie:
https://www.javadoc.io/doc/com.google.code.gson/gson/2.6.2/com/google/gson/annotations/SerializedName.html
źródło
Nie jest obsługiwane definiowanie wielu
@SerializedName
adnotacji w polu w Gson.Przyczyna: domyślnie deserializacja jest zarządzana za pomocą LinkedHashMap, a klucze są definiowane przez nazwy pól przychodzących json (nie nazwy pól klasy niestandardowej lub serializedNames) i istnieje mapowanie jeden do jednego. Widać realizacji (jak działa deserializacjia) na
ReflectiveTypeAdapterFactory
klasę za wewnętrzną klasyAdapter<T>
„sread(JsonReader in)
metody.Rozwiązanie: Możesz napisać własny TypeAdapter który obsługuje
name
,person
iuser
znaczniki json i mapuje je do nazwy pola niestandardowej klasyMyClass
:Przypadek testowy:
Przykłady dotyczące TypeAdapters.
Edycja 2016.04.06: Jak napisał @Mathieu Castets w odpowiedzi, jest teraz obsługiwana. (To jest poprawna odpowiedź na to pytanie.)
źródło
dla fanów Kotlina
źródło
W przypadku KOTLIN użyłem poniżej, ale nie działa
więc go zredagowałem i tutaj działa dobrze !!
źródło