2012-06-01 3 views
4

У меня есть класс, как это:Как изменить @SerializedName, из GSON, атрибута в расширенном классе

class A { 
    @Expose 
    @SerializedName("a_id") 
    private String id; 
} 

Теперь я хочу создать класс B, который расширяет, но, в B, I хотите изменить SerializedName id на "b_id". Есть ли способ сделать это?

+0

Разве это не сломает договор класса? Объект класса B был бы экземпляром класса B (из-за наследования), но не предлагал бы поле id, которое предлагает объект класса A ... – SJuan76

+0

Я понимаю вашу идею, но я так не думаю, потому что аннотации меняют характеристики атрибута , как геттеры и сеттеры, поэтому теоретически я могу сделать это в дочернем классе. – tpcordeiro

+0

Например, Hibernate позволяет мне [Hibernate inheritance] (http://viralpatel.net/blogs/2011/12/hibernate-inheritance-table-per-concrete-class-annotation-xml-mapping.html) См. «Наследование Hibernate Inheritance : Annotation Mapping ", где @Inheritance делает трюк. Я просто хочу знать, имеет ли GSON ту же функцию. – tpcordeiro

ответ

2

Невозможно из коробки. Вам нужно будет написать адаптер настраиваемого типа. См. Раздел Custom Serialization and Deserialization руководства пользователя Gson.

0

применять @SerializedName ("b_id") в инкубаторе в B

класс B { частный идентификатор строки;

@SerializedName("b_id") 
private void setId(String id); 

}

0

С Gson версии 2.4 вы можете использовать альтернативные имена. В вашем случае вы можете сделать это следующим образом:

class A { 
    @Expose 
    @SerializedName(value = "a_id", alternate="b_id") 
    private String id; 
} 

Формат таков:

@SerializedName(value="name1", alternate={"name2", "name3"}) 

Подробнее here.

Смежные вопросы