#json #kotlin #gson #deserialization #typetoken
#json #kotlin #gson #десериализация #typetoken
Вопрос:
Например: POJO является
class Student(val name : String, val age : Int)
и строка JSON
[["Avinash", 21], ["Sai", 23], ["pavan", 30]]
Я хочу, чтобы gson десериализовал JSON, поскольку List<Student>
я пытался использовать TypeToken, но он не работает
Комментарии:
1.
TypeToken
не имеет к этому никакого отношения. Как вы думаете, почему Gson должен автоматически сопоставлятьname
иage
с[0]
и[1]
, не давая ему никаких подсказок о том, как это должно быть сделано?2. хм, да, есть ли способ это сделать?
3. Внедрите адаптер пользовательского типа, который преобразует элементы массива в правильные
Student
аргументы конструктора и вызывает конструктор.4. Можно
json
ли его изменить? Если это возможно, я бы начал с этого, поскольку в настоящее время он очень плохо спроектирован, где позиция элемента сопоставляется с определенным полем
Ответ №1:
спасибо, пушистый, это сработало для меня
класс данных Student( имя значения: строка, возраст значения: Int)
fun main() {
val json = "[['AVINASH' , 21] , ['Sai' , 23]]"
val type = object : TypeToken<List<Student>>() {}.type
val gsonBuilder = GsonBuilder()
gsonBuilder.registerTypeAdapter(Student::class.java, object : JsonDeserializer<Student> {
override fun deserialize(json: JsonElement, p1: Type?, p2: JsonDeserializationContext?): Student {
val studentArray = json.asJsonArray
return Student(studentArray[0].asString , studentArray[1].asInt)
}
})
var list: List<Student> = gsonBuilder.create().fromJson(json, type)
print(list)
}
Комментарии:
1. Рад, что вы это поняли. 🙂 Однако, если это возможно, пожалуйста, следуйте совету kdev по исправлению формата JSON, а не так.