我有一个文本文件,其中包含这样一行
players={"Messi":{"Details":{"Goals":500},"Country":"Argentina"},"Neymar":{"Clubs":["Santos", "FC barcelona", "Paris saint German"], "Country":"巴西"}}
现在我使用正则表达式来提取
{"Messi":{"Details":{"Goals":500},"Country":"Argentina"},"Neymar":{"Clubs":["Santos", "FC barcelona"", "Paris saint German"],"Country":"巴西"}}
从文本文件中将其传递给一个 case 类,该类接受 String 的值。
我正在使用这个案例类制作一个 Dataframe。
在我的例子中,JSON 字符串中的每一行的内容都可能不同。所以我正在寻找一个通用的解决方案来将任何复杂的 Json 字符串转换为 Map 值。
检查 dataframe.printSchema 时,我将玩家列作为字符串类型获取。 但我需要它作为一个 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 包含关于其内容的正确模式。
敬请期待有值(value)的解决方案。
最佳答案
如果您还可以使用 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
}
关于java - 如何在 Scala 中将复杂的 JSON 字符串转换为 MAP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55512020/