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

Scala2下使用第三方库迭代JSON数组的问题咨询

Scala JSON数组迭代问题解答

1. 可处理JSON数组迭代的第三方库

Scala生态中有多个成熟的JSON库都支持数组迭代:

  • ujson:你当前使用的库本身就支持数组的遍历操作
  • Circe:函数式风格的JSON库,提供丰富的集合操作支持
  • Play JSON:Play框架官方配套的JSON库,兼容Scala集合操作
  • Jackson Scala Module:基于Jackson的Scala适配库,支持高效的JSON数组遍历

2. 继续使用ujson的正确迭代方式

首先注意你的原始JSON格式有误:数组中的元素应该是独立的JSON对象,正确的JSON格式应为:

{"list": [{"id":1}, {"id":2}, {"id":3}]}

ujson的Arr类型本身可以转换为Scala标准集合,直接用Scala的迭代语法即可,无需手动索引和异常捕获:

import ujson._

// 解析正确格式的JSON
val json = read("""{"list": [{"id":1}, {"id":2}, {"id":3}]}""")

// 方式1:for循环遍历
for (item <- json("list").arr) {
  println(item("id"))
}

// 方式2:使用foreach
json("list").arr.foreach(item => println(item("id")))

// 方式3:转换为List后操作
val items = json("list").arr.toList
items.foreach(println)

如果一定要保留类似原代码的索引遍历,可直接利用数组长度判断,无需异常捕获:

import ujson._

val json = read("""{"list": [{"id":1}, {"id":2}, {"id":3}]}""")
val listArr = json("list").arr
var index = 0
while (index < listArr.length) {
  println(listArr(index))
  index += 1
}

3. 代码中的错误含义

你遇到的type mismatch错误源于catch块的语法错误:
Scala的try/catch结构中,catch块要求接收一个PartialFunction[Throwable, _](即带模式匹配的异常处理逻辑),而你直接在catch块中写iteration = false,没有匹配任何异常类型,编译器无法识别这个语句的类型,因此抛出类型不匹配错误。

若要保留异常捕获的写法,需明确匹配异常类型:

try {
  print(json("list")(index))
  index += 1
} catch {
  case _: IndexOutOfBoundsException => iteration = false
}

不过这种方式并不推荐,直接利用ujson数组的长度属性或集合迭代会更简洁安全。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:35:18