Десериализация JSON не работает в Jetpack Compose

Декодирование (десериализация) данных JSON в Jetpack Compose кажется довольно простым, однако я столкнулся с проблемой, которую не могу решить. Я использую последнюю версию Android Studio и не уверен, работает ли функция .decodeFromString() в AS или мне следует использовать для этого IntelliJ IDEA? Вот мой код:

dependencies {
    implementation(libs.kotlinx.serialization.json)
}

import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json

@ExperimentalSerializationApi
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            JSONsibleTheme {
                DecodedText()
            }
        }
    }
}

@Serializable
data class User(val id: Int, val name: String)

@ExperimentalSerializationApi
@Composable
fun DecodedText() {
    val jsonString = """
    {
        "id": 722549,
        "name": "John Smith"
    }
    """
    val deserialized = Json.decodeFromString<User>(string = jsonString)
    Text(
        text = "${deserialized.name}, ${deserialized.id}"
    )
}

Я не могу запустить этот код ни на симуляторе, ни на реальном устройстве, потому что аннотация @Serializable неприменима (она подчеркнута желтым цветом). В Предупреждении говорится:

// kotlinx.serialization compiler plugin is not 
// applied to the module, so this annotation would 
// not be processed. Make sure that you've setup 
// your buildscript correctly and re-import project.
0
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам также необходимо применить плагин к вашему rootbuild.gradle.kts файлу.

plugins {
    id("org.jetbrains.kotlin.plugin.serialization") version "$kotlinVersion" apply false
}

и ваш appbuild.gradle.kts файл:

plugins {
    id("kotlinx-serialization")
}

Вы тоже добавили в блок плагинов уровня проекта? Пожалуйста, проверьте обновленный ответ.

Atick Faisal 28.08.2024 13:43

Также убедитесь, что версия плагина соответствует вашей версии Kotlin.

Atick Faisal 28.08.2024 13:47

Пожалуйста, проверьте логарифм, что не так. Вероятно, это ошибка времени выполнения, а не ошибка компиляции.

Atick Faisal 28.08.2024 13:56

В вашей строке json это должно быть «id», а не «user_id». Ключи должны соответствовать классу данных.

Atick Faisal 28.08.2024 14:01

Конечно. Удачи!

Atick Faisal 28.08.2024 14:06

Я хотел бы дополнить ответ @AtickFaisal (в любом случае спасибо, Атик, за указание правильного направления), потому что со всеми указанными настройками (включая плагин компилятора Compose) мое приложение Jetpack Compose работает без ошибок и успешно декодирует данные JSON.

Проект build.gradle.kts

plugins {
    alias(libs.plugins.android.application) apply false
    alias(libs.plugins.jetbrains.kotlin.android) apply false
    alias(libs.plugins.compose.compiler) apply false
    id("org.jetbrains.kotlin.plugin.serialization") version "2.0.20" apply false
}

buildscript {
    dependencies {
        classpath(libs.kotlin.serialization)
    }
}

Модуль build.gradle.kts

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.jetbrains.kotlin.android)
    alias(libs.plugins.compose.compiler)
    id("kotlinx-serialization")
}

dependencies {
    implementation(libs.kotlinx.serialization.json)
    // other implementations
}

libs.versions.toml

[versions]
agp = "8.5.2"
kotlin = "2.0.20"

[libraries]
kotlin-serialization = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlinSerialization" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" }

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }

Вот скриншот.

Другие вопросы по теме