使用 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").str
是 field1
中陣列第一個元素的 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")