如何在Play Framework中从JSON选取多个字段?
解决Play Framework解析JSON并提取指定字段的问题
我来帮你搞定这个需求!在Play Framework里处理REST返回的JSON响应,提取time和service字段并格式化输出其实很简单,咱们分两种方式来实现:
基础遍历实现(快速上手)
如果你只是想快速实现需求,可以直接遍历JSON数组的每个元素,逐个提取字段:
首先导入Play JSON的核心包:
import play.api.libs.json._
假设你已经拿到了REST返回的JSON字符串(或者已经解析成JsValue):
// 示例JSON响应字符串 val jsonResponse = """[ {"time":"2018-01-01","query":"select..","service":"sql"}, {"time":"2018-01-01","query":"select..","service":"sql"}, {"time":"2018-01-01","query":"select..","service":"sql"} ]""" // 解析字符串为JsValue val json = Json.parse(jsonResponse)
接下来遍历数组中的每个JSON对象,提取字段并格式化:
// 将JSON转为数组,遍历每个元素 val formattedOutput = json.as[JsArray].value.map { jsObject => // 用\操作符提取单个对象的time和service字段,转为String val time = (jsObject \ "time").as[String] val service = (jsObject \ "service").as[String] // 拼接成你需要的格式 s"$time,$service" }.mkString(" ") // 用空格分隔所有行 // 输出结果:"2018-01-01,sql 2018-01-01,sql 2018-01-01,sql" println(formattedOutput)
你之前提到用\获取time返回List Buffer,应该是直接对整个JSON数组用了json \ "time"——这样会提取数组中所有对象的time字段,返回一个JsArray,转换成集合就是类似ListBuffer的结构。所以一定要遍历数组里的每个对象,再单独提取字段哦!
类型安全的解析方式(生产环境推荐)
如果是在生产环境中,推荐用类型安全的方式解析,避免字段缺失或类型不匹配的问题:
- 先定义一个对应JSON结构的case class(只保留你需要的字段):
case class LogEntry(time: String, service: String)
- 自动生成对应的JSON解析器(Play会根据case class字段自动生成):
implicit val logEntryReads: Reads[LogEntry] = Json.reads[LogEntry]
- 解析整个JSON数组为
List[LogEntry],然后格式化输出:
// 安全解析,处理成功/失败的情况 json.validate[List[LogEntry]] match { case JsSuccess(logEntries, _) => val formattedOutput = logEntries.map(entry => s"${entry.time},${entry.service}").mkString(" ") println(formattedOutput) case JsError(errors) => // 处理解析错误,比如打印详细错误信息 println(s"JSON解析失败,错误信息:$errors") }
这种方式不仅更清晰,还能在JSON格式不符合预期时给出明确的错误提示,非常适合生产环境使用。
内容的提问来源于stack exchange,提问作者William R
相关产品推荐
相关产品推荐

