在 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 [关闭]

如何在python中将json转换为csv?

在scala中将spark决策树模型调试字符串转换为嵌套JSON

在 bash 中将 CSV 转换为 JSON

如何在 php 中将 Json 转换为 CSV