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

如何在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的结构。所以一定要遍历数组里的每个对象,再单独提取字段哦!

类型安全的解析方式(生产环境推荐)

如果是在生产环境中,推荐用类型安全的方式解析,避免字段缺失或类型不匹配的问题:

  1. 先定义一个对应JSON结构的case class(只保留你需要的字段):
case class LogEntry(time: String, service: String)
  1. 自动生成对应的JSON解析器(Play会根据case class字段自动生成):
implicit val logEntryReads: Reads[LogEntry] = Json.reads[LogEntry]
  1. 解析整个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:27:52