Scala 手動讀取 JSON

如果給你一個 JSON 字串:

val str =
    """{
    |    "name" : "Jsony McJsonface",
    |    "age" : 18,
    |    "hobbies" : [ "Fishing", "Hunting", "Camping" ],
    |    "pet" : {
    |        "name" : "Doggy",
    |        "type" : "dog"
    |    }
    |}""".stripMargin

你可以解析它以獲取表示 JSON 樹的 JsValue

val json = Json.parse(str)

並遍歷樹以查詢特定值:

(json \ "name").as[String]          // "Jsony McJsonface"

有用的方法

  • \轉到 JSON 物件中的特定鍵
  • \\轉到 JSON 物件中特定鍵的所有出現,在巢狀物件中遞迴搜尋
  • .apply(idx)(即 (idx))轉到陣列中的索引
  • .as[T] 投射到精確的亞型
  • .asOpt[T] 試圖轉換為精確的子型別,如果型別錯誤則返回 None
  • .validate[T] 嘗試將 JSON 值轉換為精確的子型別,返回 JsSuccess 或 JsError
(json \ "name").as[String]          // "Jsony McJsonface"
(json \ "pet" \ "name").as[String]  // "Doggy"
(json \\ "name").map(_.as[String])  // List("Jsony McJsonface", "Doggy")
(json \\ "type")(0).as[String]      // "dog"
(json \ "wrongkey").as[String]      // throws JsResultException
(json \ "age").as[Int]              // 18
(json \ "hobbies").as[Seq[String]]  // List("Fishing", "Hunting", "Camping")
(json \ "hobbies")(2).as[String]    // "Camping"
(json \ "age").asOpt[String]        // None
(json \ "age").validate[String]     // JsError containing some error detail