在JAVA中,习惯了JacksonObjectMapper的方便与简洁,那Scala中是否有同样类似的ObjectMapper呢?答案是真有,并且是专有,名称是jackson-module-scala。
1. 添加依赖
理所当然的SBT。
name := "scala-datas"
version := "0.1"
scalaVersion := "2.12.8"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.5" % "test"
libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.9.8"
2. 初始化ObjectMapper
因为Scala有专属的数据结构,所以初始化方式稍微有点不同,需要注册专属的Scala模块,如下:
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
// 以下代码请勿省略
val objectMapper = new ObjectMapper() with ScalaObjectMapper
objectMapper.registerModule(DefaultScalaModule)
现在就可以像JAVA一样使用ObjectMapper了。
3. 对象串行化
3.1 对象转JSON
依旧是熟悉的objectMapper.writeValueAsString方法。
val yiifaa = Map("username" -> "yiifaa",
"age" -> 32)
val output = objectMapper.writeValueAsString(yiifaa)
// 结果为{"username":"yiifaa","age":32}
println(output)
3.2 JSON转对象
在JAVA中,我喜欢使用“objectMapper.readValue”方法,Scala中依旧如此。
首先创建对象,注意两点:
- 要有无参的默认构造函数;
- 不要将此类作为内部类(无法初始化);
class Employee {
var username: String = ""
var age: Int = 0
override def toString: String = s"username=${username}\tage=${age}"
}
下面是将JSON转为Scala对象的代码:
val employee = objectMapper.readValue[Employee](output)
// 输出username=yiifaa age=32
println(employee)
4. case class
当然有点意犹未尽,感觉没有发挥Scala的强大实力,尤其是黑科技——“case class”。
因为case class没有默认的无参构造器,所以需要注解“@JsonCreator”进行协助,如下:
case class Person @JsonCreator() (username: String, age: Int)
再次进行转换,一次解析成功。
val py = objectMapper.readValue[Person](output)
// 输出结果为Person(yiifaa,32)
println(py)
这篇博客介绍了如何在Scala中使用JacksonModuleScala进行JSON的读入与写出。文章首先说明了Scala可以像JAVA一样使用ObjectMapper,并详细讲述了添加依赖、初始化ObjectMapper以及对象的串行化过程,包括对象转JSON和JSON转对象的方法。此外,还特别讨论了如何处理Scala的case class进行JSON转换,强调了使用case class时的注意事项。
612

被折叠的 条评论
为什么被折叠?



