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

