Scala获取映射对象上特定数据类型中的JSON值

Scala获取映射对象上特定数据类型中的JSON值,json,scala,jackson,Json,Scala,Jackson,使用jackson库,我从一个文件(文件的每一行都是一个json对象)中读取json数据,并将其解析为一个String和Any的map对象。我的目标是将指定的键(id和文本)保存到集合中 val input = scala.io.Source.fromFile("data.json").getLines() val mapper = new ObjectMapper() with DefaultScalaModule val data_collection = mutable.HashMap.e

使用jackson库,我从一个文件(文件的每一行都是一个json对象)中读取json数据,并将其解析为一个String和Any的map对象。我的目标是将指定的键(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")
      )
以下是文件中JSON数据的示例:

{"text": "Hello How are you", "id": 1}
在Scala中,是否可以将id值解析为Int,将文本值解析为String,或者至少将某些(值)转换为Int或String类型的值?

请尝试以下代码:

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)
import com.fasterxml.jackson.databind.ObjectMapper
导入com.fasterxml.jackson.module.scala.DefaultScalaModule
进口
com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
val input=scala.io.Source.fromFile(“data.json”).getLines()
val mapper=带有ScalaObjectMapper的新ObjectMapper()
mapper.registerModule(DefaultScalaModule)
val obj=mapper.readValue[Map[String,Any]](输入)
val data_collection=mutable.HashMap.empty[Int,String]
(你好,你好)
尝试以下代码:

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)
import com.fasterxml.jackson.databind.ObjectMapper
导入com.fasterxml.jackson.module.scala.DefaultScalaModule
进口
com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
val input=scala.io.Source.fromFile(“data.json”).getLines()
val mapper=带有ScalaObjectMapper的新ObjectMapper()
mapper.registerModule(DefaultScalaModule)
val obj=mapper.readValue[Map[String,Any]](输入)
val data_collection=mutable.HashMap.empty[Int,String]
(你好,你好)

如果要从
映射而不是选项中获取普通值,可以使用
()
应用
)方法-但是如果找不到键,它将引发异常

其次,Scala类型的系统是静态的而不是动态的,如果你有一个
Any
就是它,它在运行时不会变为
Int
String
,编译器也会失败-不过,你可以使用
asInstanceOf[t]
方法强制转换它们,但是,如果不能将类型强制转换为目标类型,它将抛出一个异常


请注意,即使您可以使用上述技巧使代码正常工作,该代码也不是您在Scala中所期望的。有一些方法可以使代码更加类型安全(如模式匹配),但是将Json解析为类型安全对象是一个老问题,我相信jackson提供了一种方法,可以将Json解析为表示数据的case类。如果您不想从
映射
而不是选项中获取普通值,可以使用
()
应用
)方法-但是如果找不到键,它将抛出异常

其次,Scala类型的系统是静态的而不是动态的,如果你有一个
Any
就是它,它在运行时不会变为
Int
String
,编译器也会失败-不过,你可以使用
asInstanceOf[t]
方法强制转换它们,但是,如果不能将类型强制转换为目标类型,它将抛出一个异常


请注意,即使您可以使用上述技巧使代码正常工作,该代码也不是您在Scala中所期望的。有一些方法可以使代码更加类型安全(如模式匹配),但是将Json解析为类型安全对象是一个老问题,我相信jackson提供了一种方法,可以将Json解析为表示数据的case类。如果没有,请查看它。

我已经尝试了
对象
。这也会导致错误<代码>错误:(27,23)类型不匹配;找到:选项[Object]必需:Int parsedJson.get(“id”),
嘿,我在代码中添加了
映射器
对象的定义。请将所有导入粘贴为well@soheil-Pourbarafrani我编辑了我的答案,对我来说效果很好,我从字符串中提取了文本,您可以替换文件读取代码。@SoheilPourbafrani如果答案对您有帮助,请接受,或者让我知道我可以挖掘更多。我已经尝试了
对象
。这也会导致错误<代码>错误:(27,23)类型不匹配;找到:选项[Object]必需:Int parsedJson.get(“id”),嘿,我在代码中添加了
映射器
对象的定义。请将所有导入粘贴为well@soheil-Pourbarafrani我编辑了我的答案,对我来说效果很好,我从字符串中提取了文本,您可以替换文件读取代码。@SoheilPourbafrani如果答案对您有帮助,请接受,或者告诉我我可以进一步挖掘