1

Any 型のオブジェクトとその TypeTag が与えられた場合、Argonaut/Shapeless を使用してその JSON を作成するにはどうすればよいでしょうか?

  case class Person(name: String, age: Int)

  // somewhere in the code where type of 'any' is known,
  // and we preferrably dont want to include information
  // about JSON capabilities (i.e. prefer not to include
  // implicit EncodeJson[Person])
  val tt = typeTag[Person].asInstanceOf[TypeTag[Any]]
  val any = Person("myname", 123).asInstanceOf[Any]

  //somewhere else in the code where type of 'any' is unknown, but we got the TypeTag 'tt'
  implicit val e: EncodeJson[ ??? ] = ??? //somehow utilize 'tt' here?
  println(any.asJson)
4

1 に答える 1

1

リフレクションを使用しないと、つまりコンパイル時の型の安全性がないと、これは不可能だと思います。型タグを にキャストするとすぐにTypeTag[Any]、コンパイラはそれを使用して暗黙の値を解決できなくなりEncodeJsonます。私の知る限り、実行時に暗黙的なパラメーターを解決することは不可能です。ありますがtoolbox.inferImplicitValue、これも役に立たないと思います。

考えられるすべてのタイプがわかっている場合は、match/case ステートメントを使用しEncodeJsonて、ランタイム タイプに基づいてオブジェクトの val を選択し、明示的に渡すことができます。

EncodeJsonただし、オブジェクトの情報を保持することをお勧めします。

于 2016-07-21T08:53:15.993 に答える