2016-07-18 1 views
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) 
+1

리플렉션을 사용하지 않고 가능하지 않다고 생각합니다. 즉, 컴파일 타임 유형의 안전성이 있다고 생각합니다. 타입 태그를'TypeTag [Any]'로 변환하자마자, 컴파일러는 더 이상 그것을 사용하여 암시적인'EncodeJson' 값을 해석 할 수 없습니다. 도메인 객체에서 JSON 인코딩을 분리하려면 유형 클래스 사용을 고려할 수 있습니다. 그러나 도메인 객체를'Any'로 변환하자 마자 어떤 경우라도 잃어 버리게됩니다. 런타임시 유형에 기반하여 객체의'EncodeJson' val을 선택하기 위해 match/case 문을 사용할 수 있습니다. – devkat

+0

나는 본다. 그것을 피하기를 희망했다. 어느 정도의 성찰을 받아 들일 수 있다면, 어떻게 적절한 EncodeJson의 인스턴스를 얻을 수 있을까요? 나는 ArgonautShapeless 'EncodeJson.of [T]'에 대해 생각하고 있습니다. 그러나 런타임에 적용 가능한지 알아낼 수 없습니다. – eirirlar

+0

조금 더 연구가 끝나면 암시 적 매개 변수를 런타임에 해결하는 것이 불가능 해 보입니다. 'toolbox.inferImplicitValue' (https://groups.google.com/forum/#!topic/scala-internals/ta-vbUT6JE8%5B1-25%5D)가 있지만이 방법이 도움이된다고 생각하지 않습니다. 객체에 대한'EncodeJson' 정보를 보존 할 것을 권합니다. 귀하의 조언에 따라 – devkat

답변

1

나는이 컴파일시의 형태 안전성, 즉 반사를 사용하지 않고 가능하다고 생각하지 않습니다. 형식 태그를 TypeTag[Any]으로 변환하면 컴파일러는 더 이상 암시적인 EncodeJson 값을 확인할 수 없습니다. 내가 아는 한 런타임에서 암시 적 매개 변수를 해결하는 것은 불가능합니다. toolbox.inferImplicitValue가 있지만이 방법이 도움이된다고 생각하지 않습니다.

모든 가능한 유형을 알고있는 경우 일치 유형/사례 문을 사용하여 런타임 유형에 따라 오브젝트의 EncodeJson val을 선택하고 명시 적으로 전달할 수 있습니다.

그래도 개체에 대한 정보는 EncodeJson으로 보존하는 것이 좋습니다.