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 ]] |
-
感谢Sebastian的帮助。我已经用其他更适合数据工作流程的策略解决了我的问题,但是无论如何,您所做的贡献都是完美而简单的。
-
嗨,如何提取呢?{" items":[{" name":" apple"," value":" 2"},{" name":" banana"," value":" 5"}]}
-
@noors,您需要一个包含项目列表的案例类。例如,案例类Container(List <Item> items),案例类Item(name:String,value:String),json.extract [Container]
-
@SebastianCelestino我有实体容器(物品:Seq [Item])
希望下面的代码有所帮助。
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"))} |
- 谢谢南达,但问题是,即使我将data.values分配给val,该类型也不是List。例如:val dataList = data.values。 dataList.getClass返回:类scala.collection.immutable。$ colon $ colon
-
scala.collection.immutable.$colon$colon是用于创建列表的类之一,例如1 :: 2 :: 3 :: Nil == List(1,2,3)