Есть ли способ в Gson сопоставить несколько полей JSON с одной переменной-членом объекта Java?
Допустим, у меня есть класс Java ...
public class MyClass {
String id;
String name;
}
Я хочу использовать этот единственный класс с двумя разными сервисами. Однако эти две службы отличаются тем, как они возвращают свои данные ...
{ "id": 2341, "person": "Bob" }
... и ...
{ "id": 5382, "user": "Mary" }
... соответственно.
Есть ли способ , чтобы отобразить оба "person"
и "user"
поле в строке JSON на name
поле в объекте Java?
(Примечание: мне нужно только преобразовать из строки JSON в объект Java - никогда наоборот.)
Ответы:
В октябре 2015 года в Gson версии 2.4 ( журнал изменений ) добавлена возможность использования альтернативных / нескольких имен
@SerializedName
при десериализации. Больше не требуется настраиваемый TypeAdapter!Использование:
https://www.javadoc.io/doc/com.google.code.gson/gson/2.6.2/com/google/gson/annotations/SerializedName.html
источник
Не поддерживается определение нескольких
@SerializedName
аннотаций к полю в Gson.Причина: по умолчанию десериализация управляется с помощью LinkedHashMap, а ключи определяются именами входящих полей json (а не именами полей настраиваемого класса или сериализованными именами), и существует сопоставление один к одному. Вы можете увидеть реализацию (каким образом десериализации работы) на
ReflectiveTypeAdapterFactory
внутренний класс классаAdapter<T>
«sread(JsonReader in)
метод.Решение: Вы можете написать собственный TypeAdapter , который обрабатывает
name
,person
иuser
JSon теги и отображает их на поле имени пользовательского классаMyClass
:Прецедент:
Примеры о TypeAdapters.
Изменить 2016.04.06: как написал @Mathieu Castets в своем ответе, теперь он поддерживается. (Это правильный ответ на этот вопрос.)
источник
для фанатов Котлина
источник
Для КОТЛИНА я использовал ниже, но не работает
поэтому я отредактировал его, и здесь он отлично работает !!
источник