Как десериализовать массив значений в коллекцию с помощью сериализации kotlinx

#kotlin #deserialization #kotlinx.serialization

#котлин #десериализация #kotlinx.сериализация

Вопрос:

Привет, я новичок в сериализации kotlinx, и я использую KMP, мои требования немного отличаются

мой класс данных

@Serializable класс данных Студент (имя значения: Строка , возраст значения : Int)

и мой простой JSON был бы «[‘Avinash’, 22]».,

который должен быть десериализован в Student(«Avinash», 22)

Я не могу десериализовать его, кто-нибудь может мне помочь

Комментарии:

1. Как указывали другие, ваш «простой JSON» не является правильно сформированным JSON

Ответ №1:

Хотя входные данные, такие как [Avinash, 22] неправильно сформированный Json, вы все равно можете работать с ним, анализируя его в JsonElement :

 import kotlinx.serialization.json.*

data class Student(val name: String, val age: Int)

fun decode(stringData: String, parser: Json): List<Student> {
    val element: JsonArray = parser.parseToJsonElement(stringData).jsonArray
    return element.windowed(2, 2).map {
        Student(
            it[0].toString(),
            it[1].toString().toInt()
        )
    }
}

fun main() {
    val parser = Json { isLenient = true }
    val students = decode("[A, 22, B, 33, C, 44]", parser)
    println(students)
    // [Student(name=A, age=22), Student(name=B, age=33), Student(name=C, age=44)]
}

 

Ответ №2:

Попробуйте это:

 val student: Student = Json.decodeFromString("{"name": "Avinash", "age": "22"}")
 

Обратите внимание, как форматировать строку JSON.

  • [] квадратные скобки предназначены для массивов
  • {} фигурные скобки предназначены для объектов

И вы должны указать имя своего поля и использовать двойные кавычки для полей и значений или использовать менее строгую Json десериализацию:

 val json = Json {
    isLenient = true
}
val student: Student = json.decodeFromString("{name: Avinash, age: 22}")
 

Если вы хотите получить глубокое представление о схеме json, вы можете прочитать здесь .

Комментарии:

1. привет @shadowsheep, спасибо за предложение :), мне действительно нужно десериализовать массив значений в объект, мы пытаемся уменьшить использование данных, поэтому мы получаем значения в массивах, которые я просил. Есть ли какой-либо способ сделать это?

2. @avinashsaipavanmunnangi это нестандартный способ десериализации объекта. На самом деле, первое, что приходит мне в голову, это десериализовать его как массив строк, а затем написать свою пользовательскую функцию сопоставления, которая создает ваши объекты.