Any类型的对象的JSON和TypeTag

时间:2016-07-18 07:29:27

标签: scala shapeless argonaut argonaut-shapeless

给定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)

1 个答案:

答案 0 :(得分:1)

如果不使用反射,即使编译时类型安全,我认为这是不可能的。只要将类型标记转换为TypeTag[Any],编译器就不能再使用它来解析隐式EncodeJson值。据我所知,在运行时无法解析隐式参数。有toolbox.inferImplicitValue,但我认为这也无济于事。

如果你知道所有可能的类型,你可以使用match / case语句根据运行时类型为你的对象选择EncodeJson val,并明确地传递它。

我建议保留对象的EncodeJson信息。