【问题标题】:Play Json Parser: How to ignore field during json parser玩 Json Parser:如何在 json 解析器期间忽略字段
【发布时间】:2018-09-30 07:08:53
【问题描述】:

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

【问题讨论】:

    标签: json scala parsing playframework play-json


    【解决方案1】:

    我会做一个预解析函数来重命名“坏”公司。

    请参阅教程以获取灵感:Traversing-a-JsValue-structure

    因此,您的解析将起作用,只需稍作改动:

    case class User(id: String, name: String, company: Option[Company])

    company 需要是一个选项。

    【讨论】:

    • 嘿@pme,在这种情况下,我们的应用程序运行良好,但我们的要求是,如果公司发生问题,只忽略公司,但必须解析其余字段。根据您的解决方案,如果我们得到错误的公司结构,我们的整个 JSON 将被忽略,而不仅仅是一个字段。
    【解决方案2】:

    最后我们找到了解决这个问题的答案,正如我们所知,我们在 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")
    }
    

    【讨论】:

    • 我认为这不是一个好主意。考虑您有一个带有Company 列的数据库的情况;如果您在此列上建立索引,在最坏的情况下,您将拥有 很多 "no-name"Option[Company] 似乎更合适。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多