พิจารณาคลาสทั่วไปนี้:
public class ListHolder<T> {
private List<T> objects;
[...] // non relevant fields
}
ฉันใช้ Gson เพื่อดีซีเรียลไลซ์การตอบสนอง JSON จาก REST api รายการออบเจ็กต์ทั้งหมดใน 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 และโดยการปรับแต่งการดีซีเรียลไลซ์ แต่ฉันรู้สึกว่ามันจะไม่ดีนัก