如何在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
相关产品推荐
相关产品推荐

