在Scala中将JSON转换为CSV?

7

是否有任何现成的库可以将JSON字符串(很可能是多行数据)转换为CSV文件。

我在Scala中搜索了很多这样的库,但没有找到。

我需要做的是从DB源检索数据,结果集以JSON格式呈现,然后将它们转换成CSV。

之前我将JSON转换为相关的Seq [case-class],并尝试使用类似于:

但是,在包含深层次结构的情况下,这些都没有太大用处。

有任何建议吗?


1
你期望这样的库能做什么?考虑到JSON和CSV代表两种非常不同的数据结构(CSV是一个简单的二维表,而JSON使用复杂的树和列表结构),我非常怀疑是否有任何方法可以自动完成这项工作。你具体遇到了什么问题?你的JSON结构是什么样子的,你希望CSV看起来像什么? - RoToRa
就像我之前所说,使用JSON只是我想出的一种解决方案,并不是说这是更合适的方法,请查看此网站=>http://konklone.io/json/。OpenCsv、SuperCsv只是希望有scala版本的这些流行的java-csv库。但是,我的主要需求是将对象的List/Seq转换为CSV,而上述提到的库可以很好地完成这项工作。只是在寻找基于scala的库。 - mane
为什么Scala不能使用“流行的Java-csv库”? - Chrisji
当然可以,我是在问社区是否有这些库的Java版本,或者更好的是是否有成熟的Scala库。 - mane
2个回答

0

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 Pickling。
“深层次结构”可能会有问题。

0

不太确定您所说的“深层次结构”是什么意思。您是指像这样的结构吗?

case class Baz(i: Int)
case class Bar(baz: Baz)
case class Foo(bar: Bar)

在这种情况下,kantan.csv 可以解决部分问题:将深层次的 case class 层级转换为 CSV 数据。只要您不介意使用 shapeless 依赖项,这是相当简单的。
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)

有点啰嗦,但我认为还是可以接受的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接