如何将JSON转换为Class - scala?

时间:2014-10-13 10:28:43

标签: json scala

有一个http响应,它是一个JSON字符串

{"id":"12345","dob":"01\/01\/1991","first_name":"Joe","gender":"male"}

需要将其实例化为此类

case class UserRow(id: Long, firstName: String, lastName: String, dob: Long, gender: String)

我尝试将JSON解析为地图

val result = parseFull(response)
println(result)

输出

Some(Map(dob -> 01/01/1991, id -> 12345, first_name -> Joe,  gender -> male))

试图获得

map.get("id").toString().toLong //Throws a NumberFormatException

Dob应转换为Long类型的millis(EPOC)。感谢帮助

1 个答案:

答案 0 :(得分:2)

基本答案 您可以使用https://github.com/json4s/json4s或其他JSON-lib。并使用序列化器。

我需要调整JSON和案例类的某些部分。

  1. id 现在确实是一个数字
  2. 通过在案例类中将类型更改为选项,可以将未提供可选字段( lastName )设为可选字段
  3. 名称需要完全匹配: last_name - >的 lastName的
  4. 要处理 dob 字段中的时间,您可以尝试使用此扩展程序:

    // Joda时间 隐式val格式= org.json4s.DefaultFormats ++ org.json4s.ext.JodaTimeSerializers.all

  5. 一些代码示例

    import org.json4s._
    import org.json4s.native.Serialization
    
    implicit val formats = Serialization.formats(NoTypeHints)
    
    val jsonExample = """{"id":12345,"firstName":"Joe","gender":"male"}"""
    
    case class UserRow(id: Long, firstName: String, lastName: Option[String], dob: Option[Long], gender: String)
    

    使用示例

    scala>   Serialization.read[UserRow](jsonExample)
    res5: UserRow = UserRow(12345,Joe,None,None,male)
    

    扩展答案

    提供的JSON会导致几个问题,只能使用手工解串器https://github.com/json4s/json4s#serialization来解决