Scala中JSON的读入与写出

这篇博客介绍了如何在Scala中使用JacksonModuleScala进行JSON的读入与写出。文章首先说明了Scala可以像JAVA一样使用ObjectMapper,并详细讲述了添加依赖、初始化ObjectMapper以及对象的串行化过程,包括对象转JSON和JSON转对象的方法。此外,还特别讨论了如何处理Scala的case class进行JSON转换,强调了使用case class时的注意事项。

在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中依旧如此。

首先创建对象,注意两点:

  1. 要有无参的默认构造函数;
  2. 不要将此类作为内部类(无法初始化);
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)

参考文档

  1. jackson-module-scala
  2. jackson API
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值