区分不同类型的JsValues - Scala Play

时间:2017-04-26 14:56:04

标签: json scala playframework

我有以下代码

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)只有一个值,而其他字段(例如propertiesoptions则有另外一个json对象在他们中间。我想知道是否有办法区分两个JsValues,其中一个明显是string而另一个不是play.api.libs.json._

使用value.isInstanceOf[JsValue]并不能正常工作JsObject将这两种情况作为JsValue返回。

任何帮助将不胜感激。

1 个答案:

答案 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