【问题标题】:How to extract List and Map in json4s如何在json4s中提取List和Map
【发布时间】:2018-08-19 18:19:01
【问题描述】:

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

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

我也尝试提取到案例类,但我有 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

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

检查:

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

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

感谢您花时间阅读。

【问题讨论】:

    标签: json scala json4s


    【解决方案1】:

    如果要提取到 Case Class 而不是 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]]
    

    【讨论】:

    • 感谢塞巴斯蒂安的帮助。我已经用其他更适合数据工作流的策略解决了我的问题,但无论如何你的贡献是完美而简单的。
    • 嗨,如何提取这个?{ "items": [ { "name": "apple", "value": "2" }, { "name": "banana", "value ": "5" }]}
    • @noors 你需要一个包含项目列表的案例类。例如,case class Container(List items),case class Item(name:String, value:String),json.extract[Container]
    • @SebastianCelestino 我有实体 Container(items: Seq[Item]) & Item(name: String, value: String)。当我执行 org.json4s.native.JsonMethods.parse(jsonString).extractOpt[Container] 时,它返回 - Some(Container(List())) 即使 jsonString 完全是 Container 之外的另一个结构。如果json字符串不是Container,我需要的是获取None,例如一些错误
    • 我可以搜索字段项,例如 parse(jsonString) \ "items" 并因此验证它是容器,但这对我来说似乎不是最好的方法 :)
    【解决方案2】:

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

    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,类型也不是列表。例如:val dataList = data.values。 dataList.getClass 返回:class scala.collection.immutable.$colon$colon
    • scala.collection.immutable.$colon$colon 是用于创建 List 的类之​​一,例如 1 :: 2 :: 3 :: Nil == List(1,2,3)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2021-03-14
    • 2018-02-14
    • 2017-07-14
    • 1970-01-01
    • 2022-11-02
    相关资源
    最近更新 更多