关于json:如何在json4s中提取列表和映射

How to extract List and Map in json4s

我是Scala的新手,不知道如何使用json4s处理此Json:

解析json并通过以下方式提取以下json后:

1
val data = json \"someKey"

我有一个像这样的Json:

1
2
3
4
5
6
7
8
[{"Id":14706061,
  "Rcvr":1,
   "HasSig":true,
   "Sig":80},
 {"Id":3425490,
 "Rcvr":1,
 "HasSig":false,
 "Sig": 80}]

将其打印到控制台,它返回:

1
JArray(List(JObject(List((Id,JInt(14706061)), (Rcvr,JInt(1)), (HasSig,JBool(true)), (Sig,JInt(80), Id,JInt(3425490)), (Rcvr,JInt(1)), (HasSig,JBool(false)), (Sig,JInt(80) ))

因此,在那之后我使用了:

1
println("show values:" + data.values)

并拥有:

1
List(Map(Id -> 14706061, Rcvr -> 1, HasSig -> true, Sig -> 80), Map(Id -> 3425490, Rcvr -> 1, HasSig -> false, Sig -> 80))

但是我不知道如何从列表的每个位置提取每个地图。

我也尝试提取到案例类,但是我有0个条目:

1
2
3
4
5
6
7
case class Example (Id: BigInt, Rcvr: Int, HasSig: Boolean, Sig: Int)

case class ExampleList (examples: List[Example])

implicit val formats = DefaultFormats.strict

val dataList = data.extract[ExampleList]

在此先感谢您的帮助

PD。如果我分配:

1
val dataList = data.values

dataList(带有getClass)的类型为:类scala.collection.immutable。$ colon $ colon

PD2。解决方案

之后:

1
 val data = json \"someKey"

我放了:

val dataList = data.extract[JArray]
val examples = dataList.values

它返回一个可迭代数组及其Maps,因此已修复。

通过以下方式检查:

println("number of elements:" + examples.length)

println("show each item:" + examples.foreach(println))

感谢您抽出宝贵的时间阅读。


如果要提取到案例类而不是地图中,则提取的正确类型是List[Example],而不是ExampleList

ExampleList具有属性examples,您的json没有。这就是为什么您有一个空列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import org.json4s.native.JsonMethods._
import org.json4s._

implicit val formats = DefaultFormats

val str ="""[{"Id":14706061,
            "
Rcvr":1,
             "
HasSig":true,
             "
Sig":80},
           {"
Id":3425490,
           "
Rcvr":1,
           "
HasSig":false,
           "
Sig": 80}]"""


case class Example (Id: BigInt, Rcvr: Int, HasSig: Boolean, Sig: Int)

val json = parse(str)

val examples = json.extract[List[Example]]


希望下面的代码有所帮助。

1
2
3
4
5
6
enter code here

val iList = List(Map("Id" -> 14706061,"Rcvr" -> 1,"HasSig" ->"true","Sig" -> 80),
Map("Id" -> 3425490,"Rcvr" -> 1,"HasSig" -> false,"Sig" -> 80))

for(i <-0 until iList.size){val lMap = iList(i)println("Id:" + lMap("Id"))}