【问题标题】:How to convert Complex JSON string in to MAP in scala如何在scala中将复杂的JSON字符串转换为MAP
【发布时间】:2019-08-25 23:28:30
【问题描述】:

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

players={"Messi":{"Details":{"Goals":500},"Country":"Argentina"},"Neymar":{"Clubs":["Santos", " FC barcelona", "Paris saint German"], "Country":"Brazil"}}

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

{“梅西”:{“详情”:{“进球”:500},“国家”:“阿根廷”},“内马尔”:{“俱乐部”:[“桑托斯”,“巴塞罗那足球俱乐部” ", "巴黎圣德意志"],"国家":"巴西"}}

从文本文件中,并将其传递给一个案例类,该类接受该值作为 String

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

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

检查 dataframe.printSchema 时,我将 player 列作为字符串类型。 但我需要它作为一个 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 字符串,其中包含键和值作为结构、列表等。

所以我想将字符串转换为对应的 JSON,该 JSON 包含关于其内容的正确模式。

敬请期待有价值的解决方案。

【问题讨论】:

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


    【解决方案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
      }  
    

    【讨论】:

      【解决方案2】:

      我得到了另一个我认为更容易的解决方案。

      我为 JSON 制作了一个自己的架构,并使用了 from_json 方法与该架构,并且效果很好。

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

      而我的 ownschema 包含 Json 字符串的结构。

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

      快乐编码。

      【讨论】:

        猜你喜欢
        • 2015-03-12
        • 2020-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多