首页 > 解决方案 > Scala 获取地图对象上特定数据类型的 JSON 值

问题描述

使用杰克逊库,我从文件中读取 json 数据(文件的每一行都是一个 JSON 对象),然后将其解析为StringAny的映射对象。我的目标是将指定的键(id 和文本)保存到集合中。

val input = scala.io.Source.fromFile("data.json").getLines()
val mapper = new ObjectMapper() with DefaultScalaModule
val data_collection = mutable.HashMap.empty[Int, String]

for (i <- input){
      val parsedJson = mapper.readValue[Map[String, Any]](i)
      data_collection.put(
        parsedJson.get("id"),
        parsedJson.get("text")
      )

但是由于parsedJson映射中的值具有Any类型,获取一些像idtext这样的键,它返回Some(value)而不仅仅是具有适当类型的值。我希望id键的值是整数,文本的值是字符串。运行代码我得到了错误:

Error:(31, 23) type mismatch;
 found   : Option[Any]
 required: Int
        parsedJson.get("id"),

以下是文件中的 JSON 数据示例:

{"text": "Hello How are you", "id": 1}

在 Scala 中是否可以将 id 值解析为 Int 并将文本值解析为 String,或者至少将 Some(value) 转换为 Int 或 String 类型的值?

标签: jsonscalajackson

解决方案


试试下面的代码:

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import 
 com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper

val input = scala.io.Source.fromFile("data.json").getLines() 
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
val obj = mapper.readValue[Map[String, Any]](input)
val data_collection = mutable.HashMap.empty[Int, String]
for (i <- c) {
data_collection.put(
  obj.get("id").fold(0)(_.toString.toInt),
  obj.get("text").fold("")(_.toString)
 )
 }
println(data_collection) // Map(1 -> Hello How are you)

推荐阅读