Как преобразовать сложную строку JSON в MAP в Scala - PullRequest
4 голосов
/ 04 апреля 2019

У меня есть текстовый файл, который содержит строку типа

игроков = {"Месси": {"Подробности": {"Голы": 500}, "Страна": "Аргентина"}, "Неймар": {"Клубы": ["Сантос", " ФК барселона "," Paris Saint German "]," Страна ":" Бразилия "}}

Теперь я использую регулярное выражение для извлечения

{"Месси": {"Подробности": {"Голы": 500}, "Страна": "Аргентина"}, "Неймар": {"Клубы": ["Сантос", "ФК Барселона" "," Paris Stint German "]," Country ":" Бразилия "}}

из текстового файла и передать его в класс дел, который принимает значение как String .

и я делаю Dataframe, используя этот класс case.

В моем случае каждая строка может отличаться по содержанию в JSON String. Поэтому я ищу общее решение для преобразования любой сложной строки Json в значения Map.

При проверке dataframe.printSchema я получаю столбец игроков в виде типа String. Но мне нужно, чтобы он был как тип карты, который содержит ключ и значение как тип структуры. Я попробовал метод, указанный в этой ссылке

Как преобразовать строку json в карту скала?

когда я так использовал, я получил ошибку

"org.json4s.package $ MappingException: не знаю, как преобразовать JObject (List ((Details, JObject (List ((Goals, JString (500)))))), (Country, JString (Аргентина) )))) в класс java.lang.String "

и я использовал следующие решения

Преобразование строки JSON в объект JSON в Scala

Но они тоже не сработали для меня.

Это мой класс

case class caseClass (
                       Players :String = ""
                     )

Я извлекаю строку json, используя пользовательскую функцию.

Просто мое требование заключается в том, чтобы у меня была сложная строка Json, которая содержит ключи и значения в виде структуры, списка и т. Д.

поэтому я хочу сделать строку соответствующей ей JSON, которая содержит правильную схему относительно ее содержимого.

Пожалуйста, ожидайте ценные решения.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Если вы также можете жить с JsValue в качестве значения вместо String, это выглядит немного проще:

import play.api.libs.json._

case class CaseClass (
           Players :Option[JsValue]
         )

object CaseClass {

  implicit val jsonFormat = Json.format[CaseClass ]
}

Я видел некоторые проблемы с вашим Json - поэтому вам нужно что-то вроде:

val json = Json.parse("""{
  "Players":{
     "Messi":{"Details":{"Goals":500},"Country":"Argentina"},
     "Neymar":{"Clubs":["Santos", "FC barcelona", "Paris saint German"], "Country":"Brazil"}
  }
}"""
  )

Чтобы получить строку из этого, вы можете использовать:

  json.validate[CaseClass] match {
    case JsSuccess(cc, _) => cc.Players.toString
    case JsError(errors) => // handle errors
  }  
0 голосов
/ 08 апреля 2019

У меня есть другое решение, которое я считаю более простым.

Я создал собственную схему для метода JSON и использовал from_json со схемой, и она работала хорошо.

from_json(col("Players"),ownschema).as("new_Json")

, а my ownschema содержит структуру строки Json.

Для любых сомнений, комментарий.

Счастливое кодирование.

...