Scala Toolkit

如何存取 JSON 內的值?

語言

使用 Scala CLI,您可以在單一行中要求整個 toolkit

//> using toolkit latest

或者,您也可以只要求特定版本的 UPickle

//> using dep com.lihaoyi::upickle:3.1.0

在您的 build.sbt 檔案中,您可以新增對 Toolkit 的依賴關係

lazy val example = project.in(file("example"))
  .settings(
    scalaVersion := "3.2.2",
    libraryDependencies += "org.scala-lang" %% "toolkit" % "0.1.7"
  )

或者,您也可以只要求特定版本的 UPickle

libraryDependencies += "com.lihaoyi" %% "upickle" % "3.1.0"

在您的 build.sc 檔案中,您可以新增對 upickle 函式庫的依賴關係

object example extends ScalaModule {
  def scalaVersion = "3.2.2"
  def ivyDeps =
    Agg(
      ivy"org.scala-lang::toolkit:0.1.7"
    )
}

或者,您也可以只要求特定版本的 UPickle

ivy"com.lihaoyi::upickle:3.1.0"

存取 JSON 內的值

若要剖析 JSON 字串並存取其中的欄位,可以使用 uPickle 的一部分 uJson。

方法 ujson.read 會將 JSON 字串剖析成記憶體

val jsonString = """{"name": "Peter", "age": 13, "pets": ["Toolkitty", "Scaniel"]}"""
val json: ujson.Value  = ujson.read(jsonString)
println(json("name").str)
// prints: Peter

若要存取 "name" 欄位,我們執行 json("name"),然後呼叫 str 將其類型設為字串。

若要透過索引存取 JSON 陣列中的元素,

val pets: ujson.Value = json("pets")

val firstPet: String = pets(0).str
val secondPet: String = pets(1).str

println(s"The pets are $firstPet and $secondPet")
// prints: The pets are Toolkitty and Scaniel

您可以深入 JSON 結構,以萃取任何巢狀值。例如,json("field1")(0)("field2").strfield1 中陣列第一個元素的 field2 的字串值。

JSON 類型

在先前的範例中,我們使用 str 將 JSON 值的類型設為字串。其他類型的值也有類似的方法,即

  • num 針對數字值,傳回 Double
  • bool 針對布林值,傳回 Boolean
  • arr 針對陣列,傳回可變的 Buffer[ujson.Value]
  • obj 針對物件,傳回可變的 Map[String, ujson.Value]
import scala.collection.mutable

val jsonString = """{"name": "Peter", "age": 13, "pets": ["Toolkitty", "Scaniel"]}"""
val json = ujson.read(jsonString)

val person: mutable.Map[String, ujson.Value] = json.obj
val age: Double = person("age").num
val pets: mutable.Buffer[ujson.Value] = person("pets").arr

如果 JSON 值不符合預期的類型,uJson 會擲回 ujson.Value.InvalidData 例外狀況。

val name: Boolean = person("name").bool
// throws a ujson.Value.InvalidData: Expected ujson.Bool (data: "Peter")

此頁面的貢獻者