金田著「はじめてのandroidプログラミング 第5版」を使って、勉強しています。
「第12章アニメーションする ツーリスト情報アプリを作ろう」の第一段階p393まで、写経が進みました。コンパイルしたところ、エラーが発生しましたので、その対処方法を報告します。なおこの記事は、「Kotlin Json文字列のserialization 正しい対処できなかったので逃げ対応で対処しました]の続編です。そちらも確認してください。
どうも、Kotlinxの Json文字列のserializationのParseが使えなくなったようなので、対応するように変更しました。
以下、本書を持っている前提で説明します。本書を使って勉強中の方、一緒に勉強しましょう。
また「Kotlin Serialization Guide」を翻訳しています。こちらも参考にしてください。
##1.オリジナルのコードでエラーが発生する原因
本書では、AndroidStudio4.1を使用環境としています。私の環境は4.1.2です。この時、本書のサポートページのコード(projectのbuild.gradleファイル)を見ると、次のようにext.kotlin_versionが"1.3.72"なっています。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.3.72" // 本書オリジナル
repositories {
// 省略
}
dependencies {
// 省略
}
}
allprojects {
// 省略
}
task clean(type: Delete) {
// 省略
}
しかし、私の環境はAndroidStuido4.1.2でプロジェクトを作るとext.kotlin_versionが"1.4.21"になっています。これが原因です。module側のbuild.gradleのdependenciesに追加していたimplementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0" が kotlin_version"1.4.21"に対応していないためでした。
plugins {
// 省略
}
android {
// 省略
}
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0" // オリジナル
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
// 省略
}
##2.AndroidStudio4.1.2(kotlin_version"1.4.21")に対応するために
AndroidStudio4.1.2(kotlin_version"1.4.21")に対応するためにはKotlin.Serializationを最新の1.0.1に変更しなければなりません。変更箇所は次のとおりです。
###(1) Projectのbuild.gradleファイルの変更点
ext.kotlin_version を "1.4.21"に変更します。
build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.4.21" // 追記(AndroidStuido4.1.2でプロジェクトをつくると、このバージョンだと思います。)
// ext.kotlin_version = "1.3.72" // 削除
repositories {
// 以下省略
###(2) Moduleのbuild.gradleファイルの変更点
Moduleのbuild.gradleファイルの中のdependenciesのブロックに記述されているkotlinx-serializatioの内容を書き変える。書き変え終わったら、SyncNowを行う。またAndroidStudioからMigrationの指示があれば行う(正確には、意味を理解せず実施した)。
plugins {
// 省略
}
android {
// 省略
}
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1' // 変更追記
// implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0" // 削除
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
//以下、省略
}
###(3)Sight.ktファイルの変更点
Jsonデータをオブジェクトに変換する部分を変更する。
import android.content.res.Resources
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.json.Json
//import kotlinx.serialization.builtins.list // implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1' 対応時に削除
//import kotlinx.serialization.json.JsonConfiguration // implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1' 対応時に削除
//import kotlinx.serialization.parse // implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1' 対応時に削除
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlinx.serialization.Serializable // @Serializableを有効にするために手書きで追記した(Alt+Enterではインポートされなかった。)
@Serializable
class Sight (
// 省略
)
fun getSights(resources: Resources): List<Sight>{
// 省略
// val obj = Json(JsonConfiguration.Stable).parse(Sight.serializer().list, str) // 削除
val obj = Json { allowStructuredMapKeys = true }
.decodeFromString(ListSerializer(Sight.serializer()), str) // 変更追記
return obj
}
##最後に
とりあえず動くようにしましたが、まだ理解していません。