如何在Scala中将复杂的JSON字符串转换为MAP

时间:2019-04-04 09:10:27

标签: java json scala apache-spark intellij-idea

我有一个文本文件,其中包含类似

的行

players = {“ Messi”:{“ Details”:{“ Goals”:500},“ Country”:“ Argentina”},“ Neymar”:{“ Clubs”:[“ Santos”,“巴塞罗那足球俱乐部”,“巴黎圣德文”,“国家/地区”:“巴西”}}

现在我使用正则表达式提取

{“梅西”:{“详细信息”:{“目标”:500},“国家”:“阿根廷”},“内马尔”:{“俱乐部”:[“桑托斯”,“巴塞罗那足球俱乐部” ”,“巴黎圣德文”],“国家/地区”:“巴西”}}

从文本文件中

并将其传递给case类,该类接受该值作为 String

我正在使用这种案例类制作一个数据框。

在我的情况下,JSON字符串中的每一行内容可能都不同。因此,我正在寻找将所有复杂的Json字符串转换为Map值的通用解决方案。

在检查 dataframe.printSchema 时,我将players列作为String类型。 但我需要将它作为一个Map类型,将Key和value保留为Struct类型。 我尝试了此链接中引用的方法

How can I convert a json string to a scala map?

当我使用这种方式时,我得到了错误

“ org.json4s.package $ MappingException:不知道如何转换JObject(List((Details,JObject(List((Goals,JString(500))))),(Country,JString(Argentina ))))放入类java.lang.String“

我使用了以下解决方案

Converting JSON string to a JSON object in Scala

但是这些对我也不起作用。

这是我的案例课

case class caseClass (
                       Players :String = ""
                     )

我正在使用用户定义的函数提取json字符串。

我的要求是我有一个复杂的Json String,其中包含键和值(如struct,list等)。

所以我想将字符串转换为其对应的JSON,该JSON相对于其内容具有适当的架构。

真诚希望有价值的解决方案。

2 个答案:

答案 0 :(得分:1)

如果您还可以将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
  }  

答案 1 :(得分:0)

我有另一个解决方案,我认为它更容易。

我为JSON创建了一个自己的架构,并将 from_json 方法与该架构配合使用,效果很好。

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

和我的 ownschema 包含Json String的结构。

如有任何疑问,请发表评论。

快乐编码。