如何用Scala解析JSON字段a:[[1,2,3,4],[1,2,3,4]]并提取每组前两位?
解决Scala解析嵌套JSON数组并提取指定元素的问题
嘿,我来帮你搞定这个问题!你之前用List[Int]失败,大概率是因为没匹配到JSON里的嵌套数组结构——字段a对应的是一个数组的数组,得用List[List[Int]]来解析才行。下面我用两种常用的Scala JSON库(Play JSON和Circe)给你演示实现步骤,最终输出你想要的类似a1:1、a2:2的格式。
方法一:使用Play JSON库
Play JSON是Scala生态里很流行的JSON处理工具,步骤清晰易上手:
1. 先添加依赖(SBT项目)
在build.sbt里加入:
libraryDependencies += "com.typesafe.play" %% "play-json" % "2.9.2"
2. 完整代码实现
import play.api.libs.json._ object JsonParser extends App { // 你的目标JSON字符串 val jsonStr = """{"a":[[1,2,3,4],[1,2,3,4]]}""" // 解析JSON字符串 val json = Json.parse(jsonStr) // 提取字段"a",注意这里用List[List[Int]]匹配嵌套数组 val aNestedList: List[List[Int]] = (json \ "a").as[List[List[Int]]] // 处理每个子数组的前两位,生成你要的格式 // 如果是按所有元素顺序编号(a1到a4): val sequentialResult = aNestedList.flatMap(_.take(2)).zipWithIndex.map { case (num, idx) => s"a${idx + 1}: $num" } // 如果是按子数组分组编号(a1_1、a1_2,a2_1、a2_2): val groupedResult = aNestedList.zipWithIndex.flatMap { case (subList, groupIdx) => subList.take(2).zipWithIndex.map { case (num, elemIdx) => s"a${groupIdx + 1}_${elemIdx + 1}: $num" } } // 打印结果,按需选择一种即可 println("顺序编号结果:") sequentialResult.foreach(println) println("\n分组编号结果:") groupedResult.foreach(println) }
输出效果
顺序编号的话会得到:
a1: 1 a2: 2 a3: 1 a4: 2
分组编号的话会得到:
a1_1: 1 a1_2: 2 a2_1: 1 a2_2: 2
方法二:使用Circe库
Circe是基于函数式编程风格的JSON库,错误处理更严谨:
1. 添加依赖(SBT项目)
libraryDependencies += "io.circe" %% "circe-core" % "0.14.6" libraryDependencies += "io.circe" %% "circe-parser" % "0.14.6"
2. 完整代码实现
import io.circe._ import io.circe.parser._ object CirceParser extends App { val jsonStr = """{"a":[[1,2,3,4],[1,2,3,4]]}""" // 解析JSON,处理可能的解析错误 parse(jsonStr) match { case Right(json) => // 提取字段"a",处理提取失败的情况 json.hcursor.get[List[List[Int]]]("a") match { case Right(nestedList) => val result = nestedList.flatMap(_.take(2)).zipWithIndex.map { case (num, idx) => s"a${idx + 1}: $num" } result.foreach(println) case Left(error) => println(s"提取字段'a'失败:${error.getMessage}") } case Left(error) => println(s"JSON解析失败:${error.getMessage}") } }
为什么之前用List[Int]会失败?
你的JSON里a的值是[[1,2,3,4],[1,2,3,4]],这是一个数组嵌套数组的结构,对应Scala的类型是List[List[Int]]。如果强行用List[Int]去解析,JSON库会因为类型不匹配抛出异常——它期望的是一个一维数组,但实际拿到的是二维数组,自然解析失败啦。
内容的提问来源于stack exchange,提问作者Nathon
相关产品推荐
相关产品推荐

