在 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)
我的要求是转换两个字符串并创建一个 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)