如何在Scala中使用Jackson反序列化JSON并提取column与datatype字段
Scala 使用Jackson反序列化指定JSON的实现方案
前置依赖
首先在sbt配置中添加Jackson相关依赖,版本可根据你的Scala版本适配调整:
libraryDependencies ++= Seq( "com.fasterxml.jackson.core" % "jackson-databind" % "2.15.2", "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.15.2" )
完整实现代码
通过样例类映射JSON结构,反序列化后直接提取字段生成目标格式:
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.scala.DefaultScalaModule import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper // 映射JSON内层columnreq数组的元素结构 case class ColumnItem(column: String, datatype: String) // 映射整个JSON的根结构 case class JsonSchema( columnreq: List[ColumnItem], databaseName: String, sourceTableName: String ) object JacksonDeserializeDemo extends App { // 待解析的原始JSON字符串 val rawJson = """ { "columnreq": [ { "column": "date", "datatype": "string" }, { "column": "name", "datatype": "int" } ], "databaseName": "test", "sourceTableName": "department" } """.stripMargin // 初始化Jackson解析器,注册Scala专用模块以支持样例类解析 val jacksonMapper = new ObjectMapper() with ScalaObjectMapper jacksonMapper.registerModule(DefaultScalaModule) // 执行反序列化 val parsedData = jacksonMapper.readValue[JsonSchema](rawJson) // 生成列名-类型映射Map val columnTypeMap: Map[String, String] = parsedData.columnreq.map(item => item.column -> item.datatype).toMap // 生成列名-类型二元组列表 val columnTypeList: List[(String, String)] = parsedData.columnreq.map(item => (item.column, item.datatype)) // 单独给指定列赋值变量示例 val dateColumnType = columnTypeMap("date") val nameColumnType = columnTypeMap("name") // 测试打印 println(s"列类型映射:$columnTypeMap") println(s"列类型列表:$columnTypeList") println(s"date列的类型:$dateColumnType") }
运行结果
执行代码后输出如下:
列类型映射:Map(date -> string, name -> int) 列类型列表:List((date,string), (name,int)) date列的类型:string
你可以根据需求选择返回Map或者列表格式,也可以直接从样例类对象中读取databaseName、sourceTableName等其他根字段。
内容的提问来源于stack exchange,提问作者Debashish Das
相关产品推荐
相关产品推荐

