在 scala 中使用 for 循环创建 JSON 文件

Creating JSON file with for loop in scala

我的要求是转换两个字符串并创建一个 JSON 文件(使用 spray JSON)并保存在资源目录中。

一个输入字符串包含ID,其他输入字符串包含分数和主题

id = "alpha1"
inputstring = "science 30 math 24"

预期输出 JSON 是

{“ContentID”: “alpha1”,
“Topics”: [
           {"Score" : 30,  "TopicID" : "Science" },
           { "Score" : 24, "TopicID" :  "math”}
          ]
}

以下是我采用的方法,卡在了最后一个地方

定义大小写class

case class Topic(Score: String, TopicID: String)
case class Model(contentID: String, topic: Array[Topic])

implicit val topicJsonFormat: RootJsonFormat[Topic] = jsonFormat2(Topic)
implicit val modelJsonFormat: RootJsonFormat[Model] = jsonFormat2(Model)

正在解析输入字符串

   val a = input.split(" ").zipWithIndex.collect{case(v,i) if (i % 2 == 0) => 
     (v,i)}.map(_._1)
   val b = input.split(" ").zipWithIndex.collect{case(v,i) if (i % 2 != 0) => 
   (v,i)}.map(_._1)
   val result = a.zip(b)

最后遍历结果

paired foreach {case (x,y) =>
      val tClass = Topic(x, y)
      val mClassJsonString = Topic(x, y).toJson.prettyPrint
      out1.write(mClassJsonString.toString)
    }

文件生成为

{"Score" : 30,  "TopicID" : "Science" }
{ "Score" : 24, "TopicID" :  "math”}

问题是我无法按照上面的需要添加 contentID。 在 foreach 中添加 ContentId 会使 contentID 添加多次。

您在 foreach 中调用 toJson 创建字符串,然后将其附加到缓冲区。

您可能想要做的是先创建一个 class (ADT) 层次结构,然后将其序列化:

val topics = paired.map(Topic)

//toArray might be not necessary if topics variable is already an array
val model = Model("alpha1", topics.toArray) 

val json = model.toJson.prettyPrint
out1.write(json.toString)