【问题标题】:Scala generics usage for methods + json4s parsingScala 泛型用于方法 + json4s 解析
【发布时间】:2019-03-26 16:33:22
【问题描述】:

我不确定这是否可以实现,并且我对泛型在 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 方法时发送的类的类型来解析 json? 类似的东西:

convertToJson[Student](fileName)
convertToJson[Person](fileName)

顺便说一句,上面的代码给了我一个:

没有可用于 A. 错误的清单。

使用 json4s 进行解析。 任何帮助表示赞赏。

【问题讨论】:

    标签: scala generics json4s


    【解决方案1】:

    这会将 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。

    【讨论】:

    • 成功了!谢谢。附带说明一下,当我们有错误数据时,有没有办法处理无效的情况?说抛出异常什么的?
    • @Achilleus 如果您有错误的数据,extract 将抛出异常。您可以让调用者处理它,或者将 extract 调用包装在 Try 中并返回 Try[T],这在 Scala 中可能更标准。
    • 实际上,当我们处理嵌套的 json 并且其中的对象说字段拼写错误时,它不会抛出异常。它只会使该对象为空并继续前进。我想知道我们是否可以以某种方式指定它失败或抛出异常而不是将其清空。
    • 你能举个例子吗?如果我重命名 JSON 字符串中的一个字段,我会得到 MappingException: No usable value for <fieldname>。
    • 啊实际上,它抛出了案例类的异常。但我正在使用 Avro 特定的记录案例类。它是一个扩展 org.apache.avro.specific.SpecificRecordBase 的案例类。但在这种情况下,它以某种方式序列化为 null。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2019-04-24
    相关资源
    最近更新 更多