如何在 Scala 中解析 JSON 数据?

Tar*_*eja 5 scala spark-streaming

我是 Scala 的新手。我想在 Scala 中解析 JSON 数据。

我想循环这些数据,并在每次迭代中为id,v,qt从值中提取数据

我正在使用以下代码将其解析为 JSON

import scala.util.parsing.json._

val data =
  """
{
  "timestamp":
  1518501114949
  , "values":
  [
  {
    "id":
    "abc"
    , "v":
    0
    , "q":
    true
    , "t":
    1518501114487
  }
  ,
  {
    "id":
    "xyz"
    , "v":
    15
    , "q":
    true
    , "t":
    1518501114494
  }
  ]
}
"""

val parsed = JSON.parseFull(data)
Run Code Online (Sandbox Code Playgroud)

我得到如下输出

 Some(Map(timestamp -> 1.518501114949E12, values -> List(Map(id -> abc, v -> 0.0, q -> true, t -> 1.518501114487E12), Map(id -> xyz, v -> 15.0, q -> true, t -> 1.518501114494E12), Map(id -> klm, v -> 12.6999998, q -> true, t -> 1.518501114487E12), Map(id -> 901.Hotmelt.PSA.0759_PSAM01_Vac, v -> 1.0, q -> true, t -> 1.518501114494E12))))
Run Code Online (Sandbox Code Playgroud)

但我不知道如何循环并在此之后获取所有值

我不明白为什么时间戳被转换为 E12 值

SCo*_*uto 5

问题是 parseFull 返回一个带有 Any 的 Option ,因此您首先需要摆脱它:

使用下面的代码,您将保留这些值:

val listAsAny = parsed match {
  case Some(e:Map[Any,Any]) => e("values")
  case None => println("Failed.")
}
Run Code Online (Sandbox Code Playgroud)

但是它们仍然是 Any,因此您可以将其转换如下:

val values = listAsAny.asInstanceOf[List[Map[String, Any]]]
Run Code Online (Sandbox Code Playgroud)

现在 values 是具有以下值的地图列表,您可以像使用常规列表一样获取其中的值

List(Map(id -> abc, v -> 0.0, q -> true, t -> 1.518501114487E12), Map(id -> xyz, v -> 15.0, q -> true, t -> 1.518501114494E12))
Run Code Online (Sandbox Code Playgroud)

例如,要检索您可以执行的 id:

values.map(_("id"))
Run Code Online (Sandbox Code Playgroud)

结果将是:

List(abc, xyz)
Run Code Online (Sandbox Code Playgroud)