播放Json Parser:如何在json解析器中忽略字段

时间:2018-04-19 17:25:10

标签: json scala parsing playframework play-json

我正在使用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文件。如果我得到公司数组值,忽略公司字段并解析其余部分并映射相应的案例类。

2 个答案:

答案 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")
}