次の様なディレクトリの構成を考えてみる。
- a_lot_of_settings
a_lot_of_settings
ディレクトリの中にはa
ディレクトリとb
ディレクトリと
cディレクトリが存在し、それぞれのディレクトリの中に
settings.json`が存在する。
このsettings.json
をそれぞれ読み取り処理をしたい。
settings.json
の中身は次のようなフォーマットになっている。
{ "name": "takagimeow" }
このフォーマットと一致するdata class
を実装する。
data class Settings( val name: String, )
JSONのパースライブラリとして、Jackson
を使用する。
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.registerKotlinModule ... val mapper = jacksonObjectMapper() mapper.registerKotlinModule()
File()
のコンストラクタに渡す相対パスは、実行しようとしているmain()
関数が記述されたファイルの場所が起点ではなく、プロジェクトのルートディレクトリが起点となるので注意が必要。
File("./a_lot_of_settings").walk().forEach { dir -> if (dir.isDirectory && dir.toString() != "./a_lot_of_settings") { val jsonString: String = File("$dir/settings.json").readText(Charsets.UTF_8) val result: Settings = mapper.readValue(jsonString, Settings::class.java) println("name: ${result.name}") } }
dir
には./a_lot_of_settings
自身も格納されてしまうので弾いている。
最終的な実装は次の様な感じ。
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.registerKotlinModule import java.io.File data class Settings( val name: String, ) suspend fun main() { val mapper = jacksonObjectMapper() mapper.registerKotlinModule() File("./a_lot_of_settings").walk().forEach { dir -> if (dir.isDirectory && dir.toString() != "./a_lot_of_settings") { val jsonString: String = File("$dir/settings.json").readText(Charsets.UTF_8) val result: Settings = mapper.readValue(jsonString, Settings::class.java) println("name: ${result.name}") } } }