json - Scala Play Json - 如何从数组中的元素读取单个元素?

标签 json scala playframework extract element

我有这个json对象

val jsonObject = """
 {
  "name" : "camara",
  "project" : {
    "key" : "DOC",
    "name" : "Dockerfiles"
  },
  "cloneUrl" : "https://server/scm/doc/camara.git",
  "links" : {
    "clone" : [ {
      "href" : "https://server/scm/doc/camara.git",
      "name" : "http"
    }, {
      "href" : "ssh://git@server:7999/doc/camara.git",
      "name" : "ssh"
    } ],
    "self" : [ {
      "href" : "url1"
    },
    {
      "href" : "url2"
    } ]
  }
}
"""

对于这个案例类和 Reader:

case class Project(name: String, project: String, projectUrl: List[String])

implicit val projectReader: Reads[Project] = (
  (JsPath \ "name").read[String] and
  (JsPath \ "project" \ "name").read[String] and
  (JsPath \ "links" \ "self" \\ "href").read[List[String]])(Project.apply _)

我尝试解析这个模型:

Json.parse(jsonObject).validate[Project] match {
  case value: JsSuccess[Project] =>
     println(" >> " + value.get)
  case error: JsError =>
    println(error)
}

我得到这个错误

JsError(List((/links/self//href,List(ValidationError(error.path.result.multiple,WrappedArray())))))

我不知道如何从 self 数组中将这些 href 提取到 Project 类中,如下所示:

Project(camara,Dockerfiles,List(url1, url2))

我在互联网上到处找了一个简单的例子来帮助我走上正确的道路,但我还没有找到任何有用的东西。

如何在不更改项目类结构的情况下解决此问题?

最佳答案

  import play.api.libs.json._
  import play.api.libs.functional.syntax._
  val jsonObject = """
  {
    "name" : "camara",
    "project" : {
      "key" : "DOC",
      "name" : "Dockerfiles"
    },
    "cloneUrl" : "https://server/scm/doc/camara.git",
    "links" : {
      "clone" : [ {
        "href" : "https://server/scm/doc/camara.git",
        "name" : "http"
      }, {
        "href" : "ssh://git@server:7999/doc/camara.git",
        "name" : "ssh"
      } ],
      "self" : [ {
        "href" : "url1"
      },
      {
        "href" : "url2"
      } ]
    }
  }
  """
  case class Project(name: String, project: String, projectUrl: List[String])

  def multiUrls[T](implicit rt: Reads[T]) = Reads[List[T]] { js =>
    val l: List[JsValue] = (__ \ "links" \ "self" \\ "href")(js)
    Json.fromJson[List[T]](JsArray(l))
  }

implicit val projectReader: Reads[Project] = (
  (JsPath \ "name").read[String] and
  (JsPath \ "project" \ "name").read[String] and
  multiUrls[String])(Project.apply _)

  Json.parse(jsonObject).validate[Project] match {
    case value: JsSuccess[Project] =>
       " >> " + value.get
    case error: JsError =>
      error.toString
  }
  // >> Project(camara,Dockerfiles,List(url1, url2))

关于json - Scala Play Json - 如何从数组中的元素读取单个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31852602/

相关文章:

scala - 如何在 Play 2 模板中访问嵌套模型的属性

java - RESTful JSON 与 Jersey 2.23.2

javascript - 如何防止 Highcharts 中的列重叠

javascript - 使用 javascript setTimeout 来查看 div 是否已加载

scala - 如何在 Spark 2.1 中保存分区的 Parquet 文件?

scala - 这个 "simple"ScalaZ 教程代码示例中的隐式解析序列是什么?

playframework - Play 框架长时间运行的作业

iphone - 使用 TouchJson 序列化字典时出现问题

scala - 为什么在这种情况下不能将函数名称作为参数传递?

java - play framework接收paypal IPN请求