如何在json4s中提取List和Map

问题描述 投票:0回答:2

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

解析json并解压缩后面的json:

val data = json \\ "someKey"

我有一个这样的Json:

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

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

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) ))

所以,之后我使用了:

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

并且:

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

但我不知道如何从List的每个位置提取每个Map。

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

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。如果我分配:

val dataList = data.values

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

PD2。解

之后:

 val data = json \\ "someKey"

我放:

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

它返回一个可迭代的Array,其Maps可迭代,因此已修复。

检查:

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

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

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

json scala json4s
2个回答
0
投票

如果要提取到Case类而不是Map,正确的提取类型是List[Example],而不是ExampleList

ExampleList有一个属性examples,你的json没有。这就是你得到一个空列表的原因。

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]]

0
投票

希望以下代码有所帮助。

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"))}
© www.soinside.com 2019 - 2024. All rights reserved.