使用 Play JSON 从给定路径的 JSON 中提取数据
extracting data from JSON for a given path using Play JSON
我正在尝试创建一个函数,它将 Json 字符串和路径作为输入,returns 该路径中的数据,例如使用 Scala 从下面的 JSON 中提取 id
字段,使用路径 "employee/id"
val json = {
"employee" : {
"id" : "12345",
"department" : "Finance"
}
}
def extractData(json: String, path: String) // returns data for the given path
extractData(json, "employee/id") // returns "12345"
我可以直接使用代码提取,
val data = Json.parse(jsonData) / "employee" / "id"
我想提取数据,不对路径进行硬编码,我尝试使用下面的代码
val path = "employee/id"
val levels = path.split('/')
val data = levels.foldLeft(parsedJson)((acc, level) => (acc \ level))
我收到 Type mismatch
错误。我也尝试过,使用其他具有可变状态的方法。
在 Scala 中有什么实用的方法可以做到这一点吗?
Scala version = 2.12.10
Play json version = 2.9.0
您需要将类型 JsValue
转换为 JsLookupResult
。你可以这样做:
val jsonTest = """{
| "employee" : {
| "id" : "12345",
| "department" : "Finance"
| }
|}""".stripMargin
def main(args: Array[String]): Unit = {
val x = extractData(jsonTest, "employee/id").as[String]
println(x)
}
def extractData(json: String, path: String): JsLookupResult = {
val jsValue: JsValue = Json.parse(json)
path.split("/").foldLeft(jsValue.result) { (acc, el) =>
acc \ el
}
}
我正在尝试创建一个函数,它将 Json 字符串和路径作为输入,returns 该路径中的数据,例如使用 Scala 从下面的 JSON 中提取 id
字段,使用路径 "employee/id"
val json = {
"employee" : {
"id" : "12345",
"department" : "Finance"
}
}
def extractData(json: String, path: String) // returns data for the given path
extractData(json, "employee/id") // returns "12345"
我可以直接使用代码提取,
val data = Json.parse(jsonData) / "employee" / "id"
我想提取数据,不对路径进行硬编码,我尝试使用下面的代码
val path = "employee/id"
val levels = path.split('/')
val data = levels.foldLeft(parsedJson)((acc, level) => (acc \ level))
我收到 Type mismatch
错误。我也尝试过,使用其他具有可变状态的方法。
在 Scala 中有什么实用的方法可以做到这一点吗?
Scala version = 2.12.10
Play json version = 2.9.0
您需要将类型 JsValue
转换为 JsLookupResult
。你可以这样做:
val jsonTest = """{
| "employee" : {
| "id" : "12345",
| "department" : "Finance"
| }
|}""".stripMargin
def main(args: Array[String]): Unit = {
val x = extractData(jsonTest, "employee/id").as[String]
println(x)
}
def extractData(json: String, path: String): JsLookupResult = {
val jsValue: JsValue = Json.parse(json)
path.split("/").foldLeft(jsValue.result) { (acc, el) =>
acc \ el
}
}