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

如何在Scala中从HTTP响应字符串按指定条件提取ID生成List

解决方案

推荐使用同作者的 ujson 库,它属于Li Haoyi的工具栈,和你正在用的requests库兼容性极佳,API设计简洁轻量,和Python的json模块使用体验非常接近,无需复杂的隐式配置即可完成JSON解析操作,且支持Scala 2.11版本。

第一步:添加依赖

在你的sbt配置文件中加入以下依赖:

libraryDependencies += "com.lihaoyi" %% "ujson" % "1.4.0"

注:1.4.0是支持Scala 2.11的最新稳定版本,更高版本不再适配Scala 2.11。

第二步:修改代码实现需求

你可以选择两种使用方式,第一种是类Python的动态字段访问,无需提前定义样类,操作最简便:

import ujson._

object syncTables {
  def main(args: Array[String]): Unit = {
    try {
      val r = requests.get("https://192.168.1.253/api/device/deviceinfo.php", verifySslCerts = false)
      if (r.statusCode == 200) {
        val jsonData = ujson.read(r.text)
        // 筛选符合条件的id生成List
        val targetIds = jsonData("rows").arr
          .filter(item => item("isActive").str == "1" && item("log_forwarding").str == "1")
          .map(_("id").str)
          .toList
        
        println(targetIds) // 输出结果:List("50", "3")
      } else {
        println("Error in API call: "+r.statusCode)
      }
    } catch {
      case e: Exception => e.printStackTrace()
    }
  }
}

如果你希望用类型安全的方式,也可以搭配upickle将JSON直接反序列化为你已经定义好的deviceInfo样类,代码如下:

import upickle.default._

object syncTables {
  // 样类需要放到main方法外面,否则upickle无法自动生成解码器
  case class deviceInfo(log_forwarding_ip: String, device_name: String, id: String,
                        mgmt_ip_addr: String, log_forwarding: String, isActive: String)
  implicit val deviceInfoRW: ReadWriter[deviceInfo] = macroRW[deviceInfo]
  case class ApiResponse(rows: List[deviceInfo], status: Int)
  implicit val apiResponseRW: ReadWriter[ApiResponse] = macroRW[ApiResponse]

  def main(args: Array[String]): Unit = {
    try {
      val r = requests.get("https://192.168.1.253/api/device/deviceinfo.php", verifySslCerts = false)
      if (r.statusCode == 200) {
        val resp = read[ApiResponse](r.text)
        val targetIds = resp.rows
          .filter(item => item.isActive == "1" && item.log_forwarding == "1")
          .map(_.id)
        
        println(targetIds)
      } else {
        println("Error in API call: "+r.statusCode)
      }
    } catch {
      case e: Exception => e.printStackTrace()
    }
  }
}

此时需要额外添加upickle依赖:

libraryDependencies += "com.lihaoyi" %% "upickle" % "1.4.0"

注意事项

你返回的JSON中isActive和log_forwarding字段值均为字符串类型的"1",因此判断条件中不要和数字类型的1比较,否则会匹配失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:36:05