我有以下代码
val json : JsValue = Json.parse(jsonMap)
val jsonObj : JsObject = json.as[JsObject]
使用jsonObj.fields
我能够以key, value
的形式获得String, JsValue
对。我的JSON是嵌套的。示例如下:
{
"name": "answer",
"plural": "answers",
"base": "PersistedModel",
"idInjection": true,
"options": {
"validateUpsert": true
},
"properties": {
"sender": {
"type": "string",
"required": true,
"default": "ASK"
},
"read": {
"type": "boolean",
"required": true,
"default": false
}
}
}
正如您所看到的,某些字段(例如name
)只有一个值,而其他字段(例如properties
和options
则有另外一个json对象在他们中间。我想知道是否有办法区分两个JsValues
,其中一个明显是string
而另一个不是play.api.libs.json._
使用value.isInstanceOf[JsValue]
并不能正常工作JsObject
将这两种情况作为JsValue返回。
任何帮助将不胜感激。
答案 0 :(得分:1)
您可以使用模式匹配来测试类型:
val raw =
"""
|{
| "nulltest": null,
| "name": "answer",
| "plural": "answers",
| "base": "PersistedModel",
| "idInjection": true,
| "options": {
| "validateUpsert": true
| },
| "properties": {
| "sender": {
| "type": "string",
| "required": true,
| "default": "ASK"
| },
| "read": {
| "type": "boolean",
| "required": true,
| "default": false
| }
| }
|}
""".stripMargin
val json = Json.parse(raw).as[JsObject]
json.fields.foreach {
case (key, value) =>
val `type` = value match {
case s: JsString => "String"
case b: JsBoolean => "Boolean"
case o: JsObject => "Object"
case n: JsNumber => "Number"
case a: JsArray => "Array"
case JsNull => "Null"
}
println(s"key: $key type: ${`type`}")
}
输出:
key: nulltest type: Null
key: name type: String
key: plural type: String
key: base type: String
key: idInjection type: Boolean
key: options type: Object
key: properties type: Object