Как десериализовать массив массива объектов в список Pojo с помощью Gson

#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, а не так.