如何用play json库解析二级JSON数组?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用play json库解析二级JSON数组?相关的知识,希望对你有一定的参考价值。
这是我的Json:
{
"root": {
"qr": {
"content": "V1"
},
"datag": {
"content": {
"business": {
"content": [
{
"content": "car"
},
{
"content": "bike"
}
]
}
}
}
}
}
这是我的尝试,但我收到编译错误:
implicit val reads: Reads[rules] = (
(JsPath "content" "qr" "content").readNullable[String] and
(JsPath "content" "datag" "content" "business" "content").readNullable[Seq[String]]
)(rules.apply _)
什么是将其解析为字符串列表的最佳方法?
答案
如果你想根据你的评论将答案作为List("car","bike")
而你正在寻找一个班轮,你可以尝试这个
val json = Json.parse("""{
| "root": {
| "qr": {
| "content": "V1"
| },
| "datag": {
| "content": {
|
| "business": {
| "content": [
| {
| "content": "car"
| },
| {
| "content": "bike"
| }
| ]
| }
|
| }
| }
| }
| }""")
val contents = (json "root" "datag" "content" "business" "content" ).as[List[Map[String, String]]].flatMap(_.values)
//this can throw an error if the data under 'content' is not a List
val contentsNew = (json "root" "datag" "content" "business" "content" ).asOpt[List[Map[String, String]]].map(_.flatMap(_.values)).fold(List.empty[String])(identity)
//this one is safe option
或者我建议创建一个案例类然后使用Json.format[CaseClass]
你可以看看这个link。
另一答案
您可以使用scala json解析器将json字符串转换为Map[String,Any]
,然后使用value
获取key
。
import scala.util.parsing.json._
val jsonString =
"""{
| "root": {
| "qr": {
| "content": "V1"
| },
| "datag": {
| "content": {
|
| "business": {
| "content": [
| {
| "content": "car"
| },
| {
| "content": "bike"
| }
| ]
| }
|
| }
| }
| }
|}""".stripMargin
函数迭代复杂的json以获取键列表并获取内部json值。
def getValue(input: Map[String, Any], keys: List[String]): Any = keys match {
case lastKey :: Nil => input(lastKey)
case key :: _ => getValue(input(key).asInstanceOf[JSONObject].obj, keys.tail)
}
最后解析json并得到输出:
JSON.parseRaw(jsonString) match {
case Some(jsonVal) =>
println(jsonVal)
val jsonMapKeyValuePair: Map[String, Any] =
jsonVal.asInstanceOf[JSONObject].obj
val keys = List("root", "datag", "content", "business", "content")
val output: List[Any] =
getValue(jsonMapKeyValuePair, keys)
.asInstanceOf[JSONArray]
.list
.map(_.asInstanceOf[JSONObject].obj)
.map(_.get("content").get)
println(output)
case _ =>
println("Invalid Json Object.")
}
以上是关于如何用play json库解析二级JSON数组?的主要内容,如果未能解决你的问题,请参考以下文章