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

Scala自动化测试中用Spray Json提取指定Id值的报错解决

解决Spray Json解析JSON数组时的DeserializationException问题

嘿,我来帮你搞定这个问题!你遇到的错误根源很明确:你从接口拿到的JSON是一个数组(用[]包裹),而不是单个JSON对象,但你直接调用了asJsObject(),Spray Json当然会报错——它没法把数组转换成单个对象呀!

问题分析

你打印的输出是:

[{"Groups": [], "Id": 1}, {"Groups": [], "Id": 2}, {"Groups": [], "Id": 3}]

这是一个包含3个对象的JSON数组,而你的代码试图把整个数组当成单个对象来处理,自然会抛出spray.json.DeserializationException: JSON object expected。

正确的处理方式

我们需要先把解析后的JSON当成数组处理,再提取里面的第一个对象,最后获取它的Id字段。这里给你两种实现方式:

方式1:直接类型转换(简单但不够安全)

先确保你已经导入了Spray Json的核心包:

import spray.json._

然后修改你的处理代码:

val url = "http://api.hostip.info/get_json.php?ip=12.215.42.19"
val result = scala.io.Source.fromURL(url).mkString

// 1. 解析成JsValue
val jsonValue = result.parseJson
// 2. 转成JsArray,取出第一个元素
val firstJsonObject = jsonValue.asInstanceOf[JsArray].elements.head.asJsObject
// 3. 提取Id字段并处理成你要的格式
val targetId = firstJsonObject.getFields("Id")(0).toString.replace("\"", "")

println(targetId) // 输出:1

方式2:模式匹配(更安全,推荐)

如果担心接口返回的JSON结构可能变化(比如数组为空、第一个元素不是对象等),用模式匹配做类型检查会更稳妥,避免运行时异常:

import spray.json._

val url = "http://api.hostip.info/get_json.php?ip=12.215.42.19"
val result = scala.io.Source.fromURL(url).mkString

val targetId = result.parseJson match {
  // 匹配非空的JSON数组
  case JsArray(elements) if elements.nonEmpty =>
    elements.head match {
      // 匹配数组里的第一个JSON对象
      case JsObject(fields) =>
        fields.get("Id") match {
          // 匹配Id字段是数字的情况,直接转成Int
          case Some(JsNumber(idNum)) => idNum.intValue().toString
          // 处理Id不是数字的情况
          case _ => "无法获取有效Id"
        }
      // 处理第一个元素不是对象的情况
      case _ => "第一个元素不是JSON对象"
    }
  // 处理不是数组或者数组为空的情况
  case _ => "返回的不是有效JSON数组"
}

println(targetId) // 输出:1

为什么原来的代码会报错?

你原来的代码result.parseJson.asJsObject()直接把解析后的JsValue强制转换成JsObject,但实际上解析后的是JsArray类型,两者是Spray Json中不同的JsValue子类,类型转换失败就会抛出DeserializationException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:13:02