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 回答