circeでJsonのすべてのvalueにアクセスする
scalaでautodoc的なものが作りたくなって、Jsonの値を列挙する必要があったので調べた。
circeのドキュメントには使い方的な記載はなく、APIドキュメントにポツンとあっただけなので書いておく
foldを使うとよさそう。 引数が多いので整理したい場合は自分でJson.Folder[X]を実装してfoldWithを使うとよい。
val jsonOption = parse( """ | { | "id": "c730433b-082c-4984-9d66-855c243266f0", | "name": "Foo", | "counts": [1, 2, 3], | "values": { | "bar": true, | "baz": 100.001, | "qux": ["a", "b"] | } | } """.stripMargin) val json:Json = jsonOption.getOrElse(Json.Null) printJson(json) def printJson(json: Json): Unit ={ json.fold( throw new RuntimeException("null"), // nullの場合 printBoolean(_), // Booleanの場合 printNumber(_), // Numberの場合 printString(_), // Stringの場合 printArray(_), // Arrayの場合 printObject(_)) // Objectの場合 }
JsonObjectにたいしてはkeyの名前も欲しい場合、toMapしてMapに変換するとよさそう
def printObject(jsonObject: JsonObject): Unit ={ jsonObject.toMap.foreach{ case (key,value) => print(key ) printJson(value) } }
しかし最近Swaggerなるドキュメントを生成できるフレームワークを見つけてしまい、今やってることが無駄に思えてきた