飽きっぽい人のブログ

プログラマとしてもテスターとしても中途半端な人のブログ

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なるドキュメントを生成できるフレームワークを見つけてしまい、今やってることが無駄に思えてきた