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