阅读Scala中的JsValue

时间:2016-05-02 23:13:19

标签: json scala playframework

如何访问第一位居民的姓名?这是Json文件。以下是什么?

val bigwig = (json \ "residents")(1)..... 


import play.api.libs.json._

val json: JsValue = Json.parse("""
{
  "name" : "Watership Down",
  "location" : {
    "lat" : 51.235685,
    "long" : -1.309197
  },
  "residents" : [ {
    "name" : "Fiver",
    "age" : 4,
    "role" : null
  }, {
    "name" : "Bigwig",
    "age" : 6,
    "role" : "Owsla"
  } ]
}
""")

3 个答案:

答案 0 :(得分:6)

快速而肮脏(未经验证):

((jsonObject \ "residents").as[Seq[JsObject]].head \ "name").as[String]

答案 1 :(得分:0)

你可以通过几种方式做到这一点。

类映射和直接json字段访问的示例

import play.api.libs.json.{JsError, JsSuccess, Json}

case class JsonSchemaView(name: String, location: Location, residents: Seq[Resident])

case class Location(lat: Double, long: Double)

case class Resident(name: String, age: Int, role: Option[String])

object Location {
  implicit val locationFormat = Json.format[Location]
}

object Resident {
  implicit val residentFormat = Json.format[Resident]
}

object JsonSchemaView {
  implicit val jsonSchemaViewFormat = Json.format[JsonSchemaView]
}

object Runner {
  def main (args: Array[String]) {

    val mySchemaView = JsonSchemaView("name", Location(40, -40), Seq(Resident("ress", 4, None), Resident("josh", 16, Option("teenager"))))

    val json = Json.toJson(mySchemaView)

    println(Json.prettyPrint(json))

    val myParsedSchema = Json.parse(json.toString).validate[JsonSchemaView]

    myParsedSchema match {
      case JsSuccess(schemaView, _) =>
        println(s"success: $schemaView")
      case error: JsError =>
        println(error)
    }


    //The hard way
    val jsonObject = Json.parse(json.toString())

    (jsonObject \ "name").validate[String] match {
      case JsSuccess(name, _) =>
        println(s"success: $name")
      case error: JsError =>
        println(error)
    }

    (jsonObject \ "residents").validate[Seq[JsObject]] match {
      case JsSuccess(residents, _) =>
        residents foreach { resident =>
          println((resident \ "age").as[Int]) //unsafe, using the wrong type will cause an exception
        }
      case error: JsError =>
        println(error)
      }
   } 
}

答案 2 :(得分:0)

您的部分代码返回Json,因此您可以使用JSON basics

中的所有Json方法

对于访问name字段使用路径:(...\"name)"

要获取名称值,请使用as方法:(...\"name").as[String]