使用 Scala CLI,你可以在一行中要求整个工具包
//> using toolkit latest
或者,你只需要一个特定版本的 UPickle
//> using dep com.lihaoyi::upickle:3.1.0
在你的 build.sbt 文件中,你可以添加对工具包的依赖项
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 字符串并访问其中的字段,你可以使用 uJson,它是 uPickle 的一部分。
方法 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")