JsonParser.parse
의 작동 방식은 스칼라에서 불가능합니다. 스칼라는 강력하고 정적으로 입력 된 언어입니다. 컴파일러는 유효한 필드와 메서드 만 액세스하고 메서드에 유효한 매개 변수로 전달하는지 여부를 확인할 수 있도록 컴파일 타임에 값 유형을 알아야합니다. 수업은
case class Entity1(value:Int, unique1:Int)
case class Entity2(value:String, unique2:String)
하고 컴파일러가 parsed
의 유형 parsed.value
의 유형을 알고 또는 parsed.unique2
가 아닌 동안 parsed.unique1
유효한 필드 것을 알고 알 수있는 방법
val parsed = JsonParser.parse[mapping("entity1")](jsonString)
를 쓰기 가정? 가장 좋은 유형의 컴파일러는 parsed
에 매우 Any
과 같은 매우 일반적인 것입니다. 물론 Any
을 특정 유형으로 추후에 옮길 수는 있지만, 이것은 어떤 종류의 모든 목적을 무효로하는지 asInstanceOf
에서 명시 적으로 명시해야 함을 의미합니다.
import org.json4s.jackson.JsonMethods
implicit val formats = org.json4s.DefaultFormats // or whatever Formats you actually need
val typeMap: Map[String, scala.reflect.Manifest[_]] = Map(
"String" -> implicitly[scala.reflect.Manifest[String]],
"Int" -> implicitly[scala.reflect.Manifest[Int]]
)
def parseAny(typeName: String, jsonString: String): Any = {
val jValue = JsonMethods.parse(jsonString)
jValue.extract(formats, typeMap(typeName))
}
을하고이 같은 수행합니다 : 아직도, 어떻게 든 Any
를 반환하는 것은 당신을 위해 OK 경우, 당신은 이런 식으로 뭔가를 시도 할 수
def testParseByTypeName(typeName: String, jsonString: String): Unit = {
try {
val parsed = parseAny(typeName, jsonString)
println(s"parsed by name $typeName => ${parsed.getClass} - '$parsed'")
} catch {
case e => println(e)
}
}
def test() = {
testParseByTypeName("String", "\"abc\"")
testParseByTypeName("Int", "123")
}
P.S.을 entityName
이 외부에서 제공되지 않은 경우 (즉, 실제 유형을 찾기 위해 데이터를 분석하지 않는 경우) 실제로는 필요하지 않습니다. 코드 조각이 암몬 REPL에 붙여로, @SergGr의 아이디어에 따라
def parse[T](jsonString: String)(implicit mf: scala.reflect.Manifest[T]): T = {
val jValue = JsonMethods.parse(jsonString)
jValue.extract[T]
}
def testParse[T](prefix: String, jsonString: String)(implicit mf: scala.reflect.Manifest[T]): Unit = {
try {
val parsed = parse[T](jsonString)
println(s"$prefix => ${parsed.getClass} - '$parsed'")
} catch {
case e => println(e)
}
}
def test() = {
testParse[String]("parse String", "\"abc\"")
testParse[Int]("parse Int", "123")
}
을 음 ... 당신은 컴파일 타임 물건과 런타임 물건을 혼합하고 있습니다. –