Создание файла JSON с циклом for в Scala - PullRequest
2 голосов
/ 22 мая 2019

Мое требование - преобразовать две строки и создать файл JSON (с использованием JSON-спрея) и сохранить его в каталоге ресурсов.

одна входная строка содержит идентификатор, а другие входные строки содержат счет и тему

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

Ожидаемый вывод JSON:

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

. Ниже приведен подход, который я выбрал, и застрял на последнем месте

Определите класс дела

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, как указано выше.Добавление ContentId внутри foreach делает contentID добавленным несколько раз.

1 Ответ

1 голос
/ 22 мая 2019

Вы вызываете toJson внутри каждого foreach, создающего строки, а затем вы добавляете его в буфер.

Что вы, вероятно, хотели сделать - это сначала создать иерархию классов (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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...