1
Any 유형 및 해당 TypeTag 객체가 주어지면 Argonaut/Shapeless를 사용하여 JSON을 어떻게 만들 수 있습니까?유형 Any 및 TypeTag 객체의 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)
리플렉션을 사용하지 않고 가능하지 않다고 생각합니다. 즉, 컴파일 타임 유형의 안전성이 있다고 생각합니다. 타입 태그를'TypeTag [Any]'로 변환하자마자, 컴파일러는 더 이상 그것을 사용하여 암시적인'EncodeJson' 값을 해석 할 수 없습니다. 도메인 객체에서 JSON 인코딩을 분리하려면 유형 클래스 사용을 고려할 수 있습니다. 그러나 도메인 객체를'Any'로 변환하자 마자 어떤 경우라도 잃어 버리게됩니다. 런타임시 유형에 기반하여 객체의'EncodeJson' val을 선택하기 위해 match/case 문을 사용할 수 있습니다. – devkat
나는 본다. 그것을 피하기를 희망했다. 어느 정도의 성찰을 받아 들일 수 있다면, 어떻게 적절한 EncodeJson의 인스턴스를 얻을 수 있을까요? 나는 ArgonautShapeless 'EncodeJson.of [T]'에 대해 생각하고 있습니다. 그러나 런타임에 적용 가능한지 알아낼 수 없습니다. – eirirlar
조금 더 연구가 끝나면 암시 적 매개 변수를 런타임에 해결하는 것이 불가능 해 보입니다. 'toolbox.inferImplicitValue' (https://groups.google.com/forum/#!topic/scala-internals/ta-vbUT6JE8%5B1-25%5D)가 있지만이 방법이 도움이된다고 생각하지 않습니다. 객체에 대한'EncodeJson' 정보를 보존 할 것을 권합니다. 귀하의 조언에 따라 – devkat