Рассмотрим этот общий класс:
public class ListHolder<T> {
private List<T> objects;
[...] // non relevant fields
}
Я использую Gson для десериализации ответа JSON от API REST. Все списки объектов в API выглядят так:
{"clients":[{"id":6493557,"name":"test", [..]}, {"id":6493557,
[..]}]}
{"users":[{"id":6493557,"name":"test", [..]}, {"id":6493557,
[..]}]}
Проблема в том, что хотя структура ответов одинакова, ключевое слово, с которого начинается список, имеет имя объекта предметной области. Gson использует имя поля в качестве ключевого слова или дополнительную аннотацию @SerializedName
, но я не знаю, как получить имя T
во время компиляции.
Я знаю, что это невозможно получить во время выполнения из-за стирания типа, но аннотации в любом случае нужна константа времени компиляции, и компилятор действительно имеет эту информацию во время компиляции.
Я хотел бы использовать ListHolder<Client>
и ListHolder<User>
, которые сработали бы, если бы я мог сделать это:
public class ListHolder<T> {
@SerializedName(nameof(T).toLowerCase() + "s")
private List<T> objects;
[...] // non relevant fields
}
nameof()
существует? Есть ли другой способ решить эту проблему? Вероятно, я могу решить эту проблему с помощью TypeAdapters и настройки десериализации, но мне кажется, что это будет не очень приятно.