gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:58:18 26 4
gpt4 key购买 nike

我有这个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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com