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

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

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

@Serializable класс данных Student (имя val: String, возраст val: Int)

а мой простой JSON будет ['Avinash', 22],

который нужно десериализовать в Student (Авинаш, 22)

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


person avinash sai pavan munnangi    schedule 15.12.2020    source источник
comment
Как указывали другие, ваш простой JSON не является хорошо сформированным JSON   -  person David Soroko    schedule 15.12.2020


Ответы (3)


Хотя ввод, такой как [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)]
}

person David Soroko    schedule 15.12.2020

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

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, вы можете прочитать здесь.

person shadowsheep    schedule 15.12.2020
comment
привет @shadowsheep, спасибо за предложение :), мне действительно нужно десериализовать массив значений в объект, мы пытаемся уменьшить использование данных, чтобы мы получали значения в массивах так же, как я просил. Есть ли способ сделать это? - person avinash sai pavan munnangi; 15.12.2020
comment
@avinashsaipavanmunnangi это нестандартный способ десериализации объекта. Собственно, первое, что приходит мне в голову, - это десериализовать его как массив строк, а затем написать свою настраиваемую функцию сопоставления, которая создает ваши объекты. - person shadowsheep; 15.12.2020

Обычно List предпочтительнее Array в Котлине. Подробнее о различиях можно узнать здесь.

decodeFromString - это общая функция, поэтому она будет декодировать любой указанный вами тип (если он Serializable, как ваш собственный тип, или примитив, например List, Int и т. Д.).

Есть два способа сообщить компилятору об универсальном типе, напрямую указав тип вывода во время вызова:

val students = Json.decodeFromString<List<Student>>("[{\"name\": \"Avinash\", \"age\": 22}]")

Или указав тип выходной переменной:

val students: List<Student> = Json.decodeFromString("[{\"name\": \"Avinash\", \"age\": 22}]")

Ваша строка json должна выглядеть так: [{"name": "Avinash", "age": 22}]

person Philip    schedule 15.12.2020