我有一个文本文件,其中包含类似
的行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相对于其内容具有适当的架构。
真诚希望有价值的解决方案。
答案 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的结构。
如有任何疑问,请发表评论。
快乐编码。