【问题标题】:Scala Dynamic Parse Json using case class No Manifest available for TScala Dynamic Parse Json 使用案例类 No Manifest available for T
【发布时间】:2019-05-05 10:37:21
【问题描述】:

我有一个JSON 字符串,我创建了一个函数,它使用Scala case class 将这个JSON 解析为一个对象。我编写了以下代码以通用方式对其进行解析。但是,它给了我一个错误:

def getJsonObj[T](jsonString:String): T = {
    implicit val formats: DefaultFormats.type = DefaultFormats
      parse(jsonString).extract[T]
}

错误可以在下面找到:

Error:(19, 32) No Manifest available for T. 
parse(jsonString).extract[T] Error:(19, 32) not enough arguments for 
method extract: (implicit formats: org.json4s.Formats, implicit mf: 
scala.reflect.Manifest[T])T. Unspecified value parameter mf.
parse(jsonString).extract[T]

我找到了这个No Manifest available for Type 但我不知道如何在我的代码中修复它。另外,我发现this,Spark Scala - How to construct Scala Map from nested JSON (Scala: "No manifest available for type T") 但我需要以通用方式将case class 传递给函数。这似乎是一个常见问题,但我无法使用可用的答案来解决它,因为我是 Scala 新手。

还有一点,如何添加try-catch 来查看是否正确解析?

【问题讨论】:

    标签: scala generics


    【解决方案1】:

    我认为这个答案解决了您的问题,Scala: “No manifest available for type T”。它很容易通过隐式传递类型方法的清单来解决。我添加了一个代码示例和一个简单的错误处理函数。

      val jsonStr: String = """{"airports":[{"name":"sfo","score":1},{"name":"phx","score":1},{"name":"sjc","score":1}]}"""
    
      case class AirPortScores(name: String, score: Double)
      case class JsonRulesHandler(airports: List[AirPortScores])
    
      val json: JsonRulesHandler = getJsonObj[JsonRulesHandler](jsonStr)
      println(json)
    
    
      def getJsonObj[T](jsonString:String)(implicit m: Manifest[T]): T = {
        extractFrom(jsonString) match {
          case Success(jsonParsed) ⇒
            jsonParsed
          case Failure(exc) ⇒
            throw new IllegalArgumentException(exc)
        }
      }
    
      private def extractFrom[T](jsonString:String)(implicit m: Manifest[T]): Try[T] = {
        implicit val formats: DefaultFormats.type = DefaultFormats
    
        Try {
          parse(jsonString).extract[T]
        }
      }
    

    【讨论】:

      猜你喜欢
      • 2013-07-01
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      相关资源
      最近更新 更多