如何将scala数组写入json文件?

时间:2015-11-28 19:29:52

标签: json scala

下面是我的scala数组,

scala> val myarray = Array(("abc",25),("efd",20))
myarray: Array[(String, Int)] = Array((abc,25), (efd,20))

我想转换和编写如下json格式,

{"0":{"0":"abc","1":"efg"},
 "1":{"0":25,"1":20}}

json的名称/键由数组索引

组成
     0    1
0   (abc,25)
1   (efd,20)

Scala数组是spark代码的输出,我正在尝试保存并在下游使用,这是玩具数据。

1 个答案:

答案 0 :(得分:2)

Scala有很多JSON读者/编写者,但你不希望JSON直接对应你的数组(因为你只使用JSON数组!)。

转义字符串有点令人讨厌,因此最简单的方法是将数据粘贴到某个JSON库中的JSON数据结构中。

就个人而言,我喜欢Jawn,你会这样使用。将以下内容添加到build.sbt文件中(假设您正在使用SBT):

resolvers += Resolver.sonatypeRepo("releases")
libraryDependencies += "org.spire-math" %% "jawn-parser" % "0.8.3"
libraryDependencies += "org.spire-math" %% "jawn-ast" % "0.8.3"

然后假设你有

val myarray = Array(("abc",25),("efd",20))

用手拉出你想要的碎片并将它们装入下颚

import jawn.ast._
def arrAsObj[A, B <: JValue](arr: Array[A])(f: A => B) = JObject(
  collection.mutable.ListMap(
    arr.zipWithIndex.map{ case (a, i) => i.toString -> f(a) }: _*
  )
)
// It's hard to do this in a loop unless you use Shapeless!
val ma0 = arrAsObj(myarray.map(_._1))(x => JString(x))
val ma1 = arrAsObj(myarray.map(_._2))(x => LongNum(x))
val json = arrAsObj(Array(ma0, ma1))(identity)

已经让.toString做了你想做的事情:

scala> val json = arrAsObj(Array(ma0, ma1))(identity)
json: jawn.ast.JObject = 
  {"0":{"0":"abc","1":"efd"},"1":{"0":25,"1":20}}

您可以找到AST here的案例类,为类似玩具的示例选择正确的案例类。

这远不是唯一的方法,但除非你想自己生成JSON(不是非常难,但你可能至少想要使用JSON库来使字符串转义正确),它将遵循相同的一般形式:将您的数据放入JSON树结构中,然后生成文本。

相关问题