【问题标题】:How to write a scala array into json file?如何将scala数组写入json文件?
【发布时间】:2015-11-29 06:18:34
【问题描述】:

下面是我的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 代码的输出,我正在尝试保存它并在下游使用,这是玩具数据。

【问题讨论】:

    标签: json scala


    【解决方案1】:

    有很多用于 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 树结构中,然后生成文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      相关资源
      最近更新 更多