You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala处理含嵌套Map与List的JSON:解析提取及过滤需求

在Scala中解析JSON并过滤名称列表的实现方案

我来帮你搞定这个需求!在Scala里处理JSON,最常用的是Play JSON或者Circe库,下面我用Play JSON为例,一步步实现你的需求:

1. 添加依赖(SBT)

首先在你的build.sbt里添加Play JSON的依赖(版本可以根据Scala版本调整,这里用最新稳定版举例):

libraryDependencies += "com.typesafe.play" %% "play-json" % "2.9.2"

2. 定义JSON对应的Case Class(可选但推荐)

为了更清晰地映射JSON结构,我们可以定义对应的case class,并生成JSON格式化器:

import play.api.libs.json._

// 逐层映射JSON结构的case class
case class Link(address: String)
case class Links(self: List[Link])
case class Details(
  key: String,
  server: String,
  owner: String,
  `type`: String, // 注意type是Scala关键字,需要加反引号
  links: Links
)
case class ApiValue(name: String, upstatus: String, details: Details)
case class ApiResponse(size: Int, values: List[ApiValue])

// 自动生成JSON格式化器,用于解析和序列化
implicit val linkFormat: OFormat[Link] = Json.format[Link]
implicit val linksFormat: OFormat[Links] = Json.format[Links]
implicit val detailsFormat: OFormat[Details] = Json.format[Details]
implicit val apiValueFormat: OFormat[ApiValue] = Json.format[ApiValue]
implicit val apiResponseFormat: OFormat[ApiResponse] = Json.format[ApiResponse]

3. 解析JSON并提取名称列表

现在可以把API返回的JSON字符串解析成我们定义的对象,然后提取所有name字段:

// 模拟API返回的JSON字符串
val apiJsonStr = """{ "size": 20, "values": [{ "name": "mullock", "upstatus": "Green", "details": { "key": "rupture farms", "server": "mudos", "owner": "magog_cartel", "type": "NORMAL", "links": { "self": [{ "address": "https..." }] } } }] }"""

// 解析JSON字符串为ApiResponse对象
val parsedResponse = Json.parse(apiJsonStr).as[ApiResponse]

// 提取所有name到列表
val allNames: List[String] = parsedResponse.values.map(_.name)

4. 用另一个列表过滤名称

假设你有一个用于过滤的白名单列表,比如allowedNames,我们可以用Scala的集合操作快速完成过滤:

// 示例过滤列表
val allowedNames = List("mullock", "slig", "mudokon")

// 过滤出在允许列表中的名称
val filteredNames: List[String] = allNames.filter(allowedNames.contains)

简化方案:无需Case Class直接提取

如果你不想定义case class,也可以直接通过JSON路径提取name字段:

val namesDirectly: List[String] = (Json.parse(apiJsonStr) \ "values")
  .as[List[JsValue]]
  .map(_ \ "name")
  .as[List[String]]

这种方式更轻量,但可读性不如case class方案,适合简单场景。

内容的提问来源于stack exchange,提问作者crowgers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:44:17