Scala 工具包

如何访问 JSON 中的值?

语言

使用 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").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")

本页面的贡献者