「Kotlinx Json」の登場でサードパーティJSONライブラリは不要となる。

JSONのライブラリ何を使ってますか?

👉 square/moshi: A modern JSON library for Kotlin and Java. 
👉 FasterXML/jackson: Main Portal page for the Jackson project 
👉 google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back 

これらは、Javaベースで書かれています。Kotlin は100%相互運用可能ですが微妙に期待しない挙動をします。


data class User(
    val name: String,
    val email: String,
    val age: Int = 13,
    val role: Role = Role.Viewer
)

enum class Role { Viewer, Editor, Owner }


{
    "name" : "John Doe",
    "email" : "john.doe@email.com"
}


class JsonUnitTest {

    private val jsonString = """
            {
                "name" : "John Doe",
                "email" : "john.doe@email.com"
            }
        """.trimIndent()

    @Test
    fun gsonTest() {
        val user = Gson().fromJson(jsonString, User::class.java)

        assertEquals("John Doe",user.name)
        assertEquals(null, user.role)
        assertEquals(0, user.age)

//      User(name=John Doe, 
//           email=john.doe@email.com, 
//           age=0, 
//           role=null)

    }

}

デフォルト値が期待通りにパースできません。

kotlinx.serialization が登場!!

JetBrains産です。間違いないでしょう。



👉 Kotlin/kotlinx.serialization: Kotlin multiplatform / multi-format serialization 

- クロスプラットフォーム
- 非リフレクション
- アノテーション @Serializable
- Kotlin v1.3.30+


@Serializable
data class User(
    val name: String,
    val email: String,
    val age: Int = 13,
    val role: Role = Role.Viewer
)

enum class Role { Viewer, Editor, Owner }

class JsonUnitTest {

    private val jsonString = """
            {
                "name" : "John Doe",
                "email" : "john.doe@email.com"
            }
        """.trimIndent()

    @Test
    fun jsonTest() {
        val user = Json.parse(User.serializer(), jsonString)

        assertEquals("John Doe", user.name)
        assertEquals(Role.Viewer, user.role)
        assertEquals(13, user.age)

//      User(name=John Doe, 
//           email=john.doe@email.com, 
//           age=13, 
//           role=Viewer)

    }
}

Gson では無視されていたデフォルト値がきちんと使用されます。

以下のセットアップでどうぞ。


buildscript {
    ext.kotlin_version = '1.3.60'
    repositories { jcenter() }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
    }
}


apply plugin: 'kotlin' 
apply plugin: 'kotlinx-serialization'


repositories {
    jcenter()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.14.0" // JVM dependency
}

👉 Kotlinx Json vs Gson - Juraj Kušnier - Medium 



GoPro 分割された動画ファイルの命名規則



対象製品
- HERO7 (White、Silver、Black)
- HERO6 Black
- Fusion
- HERO (2018)
- HERO5 Black
- HERO5 Session
- HERO4 Black & Silver
- HERO Session / HERO4 Session
- HERO (2014)
- HERO3+
- HERO3
- HD HERO2


👉 GoProカメラのファイルの命名規則 

GHzzxxxx.mp4

ということですが、なぜにファイル名による並び替えが可能な

GHxxxxzz.mp4

にしなかったのか?

何らかの理由はあったのだろうと思うけども。

一括で変更する

スクリプトで一括で変更します。

以下動画のように使います。




関連ワード:  今さら聞けない


"意図しない入力文字の自動変換"

半角のクォーテーションや連続するハイフンが勝手に変換される。



エディタの設定ではなく、OSの設定だとか!

macOSの設定


「システム環境設定」

    |

「キーボード」

    |

「ユーザ辞書」

    |

「スマート引用符とスマートダッシュを使用」をOFFに。

テキストエディットの設定


「環境設定」

    |

「スマート引用符」をOFF

「スマート引用符とスマートダッシュ記号はリッチテキスト書類のみで使用」も注意です。

「スマート」って?

スマート引用符
スマートダッシュ
スマートコピー
スマートペースト
スマートリンク
スマートクォート
スマートクォーテーション
スマートハイフン

まとめ

私は、IMEとしてGoogle日本語入力を使っていますが、ここにも自動変換の設定があります。

よって、意図しない文字が入力される場合

- OS
- IME(ATOKやGoogle日本語入力)
- 入力先アプリ

の3つの設定の「スマート***」や「自動変換」あたりを確認する必要があるようです。

おせっかいぢゃんね?

便利かな?

スマートかな?