给定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)
答案 0 :(得分:1)
如果不使用反射,即使编译时类型安全,我认为这是不可能的。只要将类型标记转换为TypeTag[Any]
,编译器就不能再使用它来解析隐式EncodeJson
值。据我所知,在运行时无法解析隐式参数。有toolbox.inferImplicitValue
,但我认为这也无济于事。
如果你知道所有可能的类型,你可以使用match / case语句根据运行时类型为你的对象选择EncodeJson
val,并明确地传递它。
我建议保留对象的EncodeJson
信息。