Scala 读取并解析 JSON

Lea*_*wly 3 java json scala

我是斯卡拉新手。我有一个 JSON 文件,标题scala_input.json包含两项:

{
 "edges_file": "/path/edges.json.gz", 
 "seed_file": "/path/seed.json.gz"
}
Run Code Online (Sandbox Code Playgroud)

我希望打开该文件,val从该文件中解析和属性两个。我努力了:

val input_file = "/path/scala_input.json"
val json_data = JSON.parseFull(input_file)
val edges_file = json_data.get.asInstanceOf[Map[String, Any]]("edges_file").asInstanceOf[String]
val seeds_file = json_data.get.asInstanceOf[Map[String, Any]]("seed_file").asInstanceOf[String]]
Run Code Online (Sandbox Code Playgroud)

然而,这又回来了java.util.NoSuchElementException: None.get。我还没有定义什么?json_datainput_file正确的,我确信并且edges_file存在seed_file

Tza*_*har 6

JSON.parseFull需要一个 JSON 字符串,而不是包含此类字符串的文件的路径。所以 - 你应该首先加载文件然后解析它:

val input_file = "./scala_input.json"
val json_content = scala.io.Source.fromFile(input_file).mkString
val json_data = JSON.parseFull(json_content)
// go on from there...
Run Code Online (Sandbox Code Playgroud)


Pow*_*ers 5

os-libupickle是读取和解析 JSON 数据的更好选择。

val jsonString = os.read(os.pwd/"src"/"test"/"resources"/"scala_input.json")
val data = ujson.read(jsonString)
data("edges_file").str // "/path/edges.json.gz"
data("seed_file").str // "/path/seed.json.gz"
Run Code Online (Sandbox Code Playgroud)

这段代码比允许的要干净得多JSON.parseFull。 有关如何使用这些库的更多详细信息,请参阅此处。