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

