在 Scala 中将 JSON 转换为 CSV?
Posted
技术标签:
【中文标题】在 Scala 中将 JSON 转换为 CSV?【英文标题】:Convert JSON to CSV in Scala? 【发布时间】:2014-10-04 01:33:08 【问题描述】:是否有任何已经可用的库可以将 JSON 字符串(很可能超过 1 行数据)转换为 CSV 文件。
我在 Scala 中搜索了很多此类库,但找不到。
我需要做的是从数据库源中检索数据,结果集为 JSON 格式,并将它们转换为 CSV。
在我所做的之前是将 JSON 转换为相关的 Seq[case-class] 并尝试使用以下库:
Scala-csv (tototoshi) Might-csv但在案例类包含深层层次结构的情况下,这些并没有多大用处。
有什么建议吗??
【问题讨论】:
您希望这样的库能做什么?考虑到 JSON 和 CSV 代表两种截然不同的数据结构(CSV 是一个简单的二维表,而 JSON 使用复杂的树和列表结构),我非常怀疑是否有任何方法可以拥有一个可以自动完成的库。你有什么具体问题?你的 JSON 结构是什么样的,你的 CSV 是什么样的? 就像我说的那样,使用 JSON 只是我想出的一个解决方案,并不是说这是否更合适,请查看此站点=> konklone.io/json OpenCsv,SuperCsv 只是希望是否有这些流行的 java-csv 库的 scala 端口。但是,我的主要要求是将对象的 List/Seq 转换为 CSV,上述库可以正确执行此操作。只是在寻找基于 scala 的库。 为什么 Scala 不能使用“流行的 java-csv 库”? 当然可以,问社区是否有这些库的java端口,或者如果有成熟的scala库更好 【参考方案1】:不完全确定您所说的深层层次结构是什么意思。像这样?
case class Baz(i: Int)
case class Bar(baz: Baz)
case class Foo(bar: Bar)
在这种情况下,kantan.csv 可以回答部分问题:将深层案例类层次结构转换为 CSV 数据。如果您不介意无形的依赖关系,这相当简单:
import kantan.csv.ops._
import kantan.csv.generic.codecs._
val fs: List[Foo] = ???
fs.foldLeft(new File("output.csv").asCsvWriter[Foo])(_ write _).close
如果您对 shapeless 有疑问,您可以自己为您的案例类提供编码器:
import kantan.csv._
implicit val bazCodec = Codec.caseCodec1(Baz.apply, Baz.unapply)(0)
implicit val barCodec = Codec.caseCodec1(Bar.apply, Bar.unapply)(0)
implicit val fooCodec = Codec.caseCodec1(Foo.apply, Foo.unapply)(0)
有点样板,但我认为仍然可以接受。
【讨论】:
【参考方案2】:product-collections 会将 Seq[case class] 转换为 csv。
case class Foo(a:Int,b:String)
Seq(Foo(1,"aa"),Foo(2,"bb")).csvIterator.mkString("\n")
res27: String =
1,"aa"
2,"bb"
要反序列化 json,我可能会使用 scala 酸洗。
“深层层次结构”可能会出现问题。
【讨论】:
以上是关于在 Scala 中将 JSON 转换为 CSV?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spark 2 Scala 中将 Row 转换为 json
在 Java 中将 JSON 转换为 XLS/CSV [关闭]