我使用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文档的公司,但我们正在成功地进行解析,但是如果company包含一个数组,则会得到解析异常。我们的需求是否存在,我们可以使用play JSON库而忽略字段,如果得到解析错误,则忽略整个JSON文件。如果我得到,公司数组值,忽略公司字段,并解析其余的,并映射相应的案例类。
发布于 2018-04-20 08:46:40
我会做一个预解析函数,将“坏”公司重命名。
参见教程以获得灵感:遍历a-JsValue-结构
因此,您的解析将工作,只要做这个小小的更改:
case class User(id: String, name: String, company: Option[Company])
company需要成为一种选择。
发布于 2018-04-21 06:48:15
最后,我们找到了解决这个问题的答案,众所周知,我们在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")
}https://stackoverflow.com/questions/49926848
复制相似问题