我正在使用Scala和play JSON库来解析JSON。我们面临的问题是使用JSON解析,我们有相同的JSON结构,但是一些JSON文件包含不同的值结构,具有相同的键名。我们来举个例子:
JSON-1
{
"id": "123456",
"name": "james",
"company": {
"name": "knoldus"
}
}
JSON-2
{
"id": "123456",
"name": "james",
"company": [
"knoldus"
]
}
我的案例类
case class Company(name: String)
object Company{
implicit val _ = Json.format[Company]
}
case class User(id: String, name: String, company: Company)
object User{
implicit val _ = Json.format[Company]
}
虽然JSON包含带有JSON文档的公司,但我们正在成功解析,但如果公司包含数组,我们将获得解析异常。我们的要求是,无论如何,我们可以使用播放JSON库并忽略字段,如果得到解析错误而忽略整个JSON文件。如果我得到公司数组值,忽略公司字段并解析其余部分并映射相应的案例类。
答案 0 :(得分:1)
我会做一个预先解析的功能,它会重命名“坏”的错误。公司
请参阅教程获取灵感:Traversing-a-JsValue-structure
所以你的解析会有效,只需要做一点改动:
case class User(id: String, name: String, company: Option[Company])
company
必须是一个选项。
答案 1 :(得分:0)
最后我们找到了解决此问题的答案,正如我们所知,我们在JSON中有不同的公司结构,所以我们需要做的是,我们需要将company
声明为JsValue
,因为在无论如何,无论公司结构如何,它都很容易分配到JsValue
类型。之后,我们的要求是,我们需要使用对象结构,如果JSON
包含数组结构,则忽略它。之后,我们使用模式匹配与我们的公司JsValue
类型和成功与失败的一个基础,我们解析或JSON.
下面给出了带代码的解决方案:
case class Company(name: String)
object Company{
implicit val _ = Json.format[Company]
}
case class User(id: String, name: String, company: JsValue)
object User{
implicit val _ = Json.format[Company]
}
Json.parse("{ --- whatevery json--string --- }").validate[User].asOpt match {
case Some(obj: JsObject) => obj.as[Company]
case _ => Company("no-name")
}