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

如何将JSON文件解析行转为case class并修复Iterator[Nothing]报错

错误原因

  • 语法不完整:你编写的代码末尾缺少多个闭合括号,编译器无法正确推断类型,才会返回Iterator[Nothing]
  • 容器结构不匹配:嵌套使用map会得到Iterator[Iterable[Try[User]]]的多层嵌套结构,和你声明的Seq[User]类型不匹配
  • 类型名错误:Spray JSON的数组类型是JsArray不是JsonArray,错误的类型名也会打断类型推断流程

正确实现

你可以通过两次flatMap压平嵌套结构并过滤解析失败的结果,最终转成Seq:

import scala.util.Try
import spray.json._

// 需确保作用域内存在User类型的JsonFormat隐式实例
val users: Seq[User] = source.getLines()
  .take(10)
  // 压平所有行内JSON数组的元素
  .flatMap(line => line.parseJson.convertTo[JsArray].elements)
  // 只保留解析成功的User实例
  .flatMap(ele => Try(ele.convertTo[User]).toOption)
  // 将Iterator转为Seq
  .toSeq

如果需要严格写为单行表达式,可简化为:

val users: Seq[User] = source.getLines().take(10).flatMap(_.parseJson.convertTo[JsArray].elements.flatMap(e => Try(e.convertTo[User]).toOption)).toSeq

补充说明

如果你需要统计或处理解析失败的情况,可以将结果收集为Seq[Try[User]],自行区分成功和失败的条目:

val tryUsers: Seq[Try[User]] = source.getLines()
  .take(10)
  .flatMap(_.parseJson.convertTo[JsArray].elements)
  .map(ele => Try(ele.convertTo[User]))
  .toSeq

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:15:03