方法的 Scala 泛型用法 + json4s 解析
Scala generics usage for methods + json4s parsing
我不确定这是否可以实现,而且我对泛型在 Scala 中的工作方式有非常基本的了解。但我想知道这是否可能。
假设我有一个方法:
case class Person(id:String,name:String)
case class Student(id:String,name:String, class:String)
def convertToJson[A](fileName:String):{
//read file
parse[A]
}
是否可以编写这种通用方法,根据我在调用 convertToJson 方法时发送的 class 的类型来解析 json?
类似于:
convertToJson[Student](fileName)
convertToJson[Person](fileName)
顺便说一句,上面的代码给了我一个:
No Manifest available for A. error.
使用 json4s 进行解析。
感谢任何帮助。
这会将 JSON 字符串转换为 case class
import org.json4s._
import org.json4s.jackson.JsonMethods._
def convertToJson[T](json: String)(implicit fmt: Formats = DefaultFormats, mf: Manifest[T]): T =
Extraction.extract(parse(json))
定义后,您可以将适当的字符串解析为所需的类型:
case class Person(id: String, name: String)
case class Student(id: String, name: String, `class`: String)
val person = convertToJson[Person]("""{"name":"Jane","id":45}""")
val student = convertToJson[Student]("""{"name":"John","id":63, "class": "101"}""")
请注意,这将忽略与 case class
中的字段不匹配的 JSON 数据。如果一个字段在 JSON 中是可选的,请将其设为 case class
中的 Option
,如果该字段不存在,您将得到 None
。
我不确定这是否可以实现,而且我对泛型在 Scala 中的工作方式有非常基本的了解。但我想知道这是否可能。 假设我有一个方法:
case class Person(id:String,name:String)
case class Student(id:String,name:String, class:String)
def convertToJson[A](fileName:String):{
//read file
parse[A]
}
是否可以编写这种通用方法,根据我在调用 convertToJson 方法时发送的 class 的类型来解析 json? 类似于:
convertToJson[Student](fileName)
convertToJson[Person](fileName)
顺便说一句,上面的代码给了我一个:
No Manifest available for A. error.
使用 json4s 进行解析。 感谢任何帮助。
这会将 JSON 字符串转换为 case class
import org.json4s._
import org.json4s.jackson.JsonMethods._
def convertToJson[T](json: String)(implicit fmt: Formats = DefaultFormats, mf: Manifest[T]): T =
Extraction.extract(parse(json))
定义后,您可以将适当的字符串解析为所需的类型:
case class Person(id: String, name: String)
case class Student(id: String, name: String, `class`: String)
val person = convertToJson[Person]("""{"name":"Jane","id":45}""")
val student = convertToJson[Student]("""{"name":"John","id":63, "class": "101"}""")
请注意,这将忽略与 case class
中的字段不匹配的 JSON 数据。如果一个字段在 JSON 中是可选的,请将其设为 case class
中的 Option
,如果该字段不存在,您将得到 None
。