Ini terkait dengan pertanyaan sebelumnya yang saya tanyakan di sini sebelumnya
Penguraian JSON menggunakan Gson
Saya mencoba untuk mengurai JSON yang sama, tetapi sekarang saya telah sedikit mengubah kelas saya.
{
"lower": 20,
"upper": 40,
"delimiter": " ",
"scope": ["${title}"]
}
Kelas saya sekarang terlihat seperti:
public class TruncateElement {
private int lower;
private int upper;
private String delimiter;
private List<AttributeScope> scope;
// getters and setters
}
public enum AttributeScope {
TITLE("${title}"),
DESCRIPTION("${description}"),
private String scope;
AttributeScope(String scope) {
this.scope = scope;
}
public String getScope() {
return this.scope;
}
}
Kode ini memunculkan pengecualian,
com.google.gson.JsonParseException: The JsonDeserializer EnumTypeAdapter failed to deserialized json object "${title}" given the type class com.amazon.seo.attribute.template.parse.data.AttributeScope
at
Pengecualian dapat dimengerti, karena sesuai dengan solusi untuk pertanyaan saya sebelumnya, GSON mengharapkan objek Enum benar-benar dibuat sebagai
${title}("${title}"),
${description}("${description}");
Tetapi karena ini secara sintaksis tidak mungkin, apa solusi yang disarankan, solusinya?
"1"
, misalnya, daripada hanya1
...SerializedName
maka enum akan default kenull
. Perilaku default dari keadaan yang tidak diketahui dapat ditangani di kelas pembungkus. Namun, jika Anda memerlukan representasi untuk "tidak diketahui" selain darinull
itu, Anda perlu menulis deserializer khusus atau adaptor tipe.Gunakan anotasi
@SerializedName
:sumber
Dengan GSON versi 2.2.2, enum akan diatur dan tidak diatur dengan mudah.
sumber
Potongan berikut menghilangkan kebutuhan akan eksplisit
Gson.registerTypeAdapter(...)
, menggunakan@JsonAdapter(class)
anotasi, tersedia sejak Gson 2.3 (lihat komentar pm_labs ).sumber
Jika Anda benar-benar ingin menggunakan nilai ordinal Enum, Anda dapat mendaftarkan pabrik adaptor tipe untuk menggantikan pabrik default Gson.
Kemudian daftarkan saja pabriknya.
sumber
gunakan metode ini
sumber