1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Kotlin Json文字列のserializationのParseが使えなくなったので、使えるように修正しました。

Last updated at Posted at 2021-02-02

 金田著「はじめての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"なっています。

build.gradle
// 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"に対応していないためでした。

build.gradle
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の指示があれば行う(正確には、意味を理解せず実施した)。

build.gradle
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
}

##最後に
 とりあえず動くようにしましたが、まだ理解していません。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?