如何检查JsArray是否包含Object或Simple类型



我需要编写一个接收JsValue的函数,并执行以下步骤:

  1. 检查其类型是否为Array
  2. 如果是NOT数组,则返回列表中的值
  3. 如果它是数组,请检查它的对象数组或简单类型(字符串、布尔值等(
  4. 如果其简单类型的Array返回该Array;这是一个具有简单类型"的数组
  5. 如果其对象数组返回该数组并打印"数组";这是一个带有对象"的数组

所以类似这样的东西:

def myFunc(json: JsValue) = {
if (json.isInstanceOf[JsArray]) {
// check if list of objects or simple type
// how do i check if its a list of objects or simple type??
} else {
JsArray(json)
}
}

谢谢!

我发现模式匹配在这类情况下往往会有很大帮助。

所以我们从骨架开始。明确所需的结果类型有助于指导推理。

def myFunc(json: JsValue): JsArray =
json match {
// Fill in cases later
}
  1. 如果它是NOT数组,则返回列表中的值
def myFunc(json: JsValue): JsArray =
json match {
case JsArray(members) => ???
case _ => JsArray(Array(json))
}
  1. 如果其简单类型的Array返回此Array并打印";这是一个具有简单类型"的数组
  2. 如果其对象数组返回该数组并打印"数组";这是一个带有对象"的数组

围绕模糊性(空数组?简单数组和对象?嵌套数组?(做出一些假设:

def isSimple(json: JsValue) =
json match {
case _: JsArray | _: JsObject => false
case _ => true
}
def myFunc(json: JsValue): JsArray =
json match {
case arr @ JsArray(members) =>
// arr is effectively json.asInstanceOf[JsArray]
if (members.forall(isSimple)) {
// array is empty, or every member is simple
println("this is an array with simple types")
} else {
// array contains at least one array or object
println("this is an array with objects")
}
arr
case _ => JsArray(Array(json))
}

您可以使用validate方法,请参阅本文档https://www.playframework.com/documentation/2.8.x/ScalaJson您将在这里获得多种方法,验证是其中之一,也是首选方法。

val input = """{
|       "a": "1233"
|   }""".stripMargin
val json = Json.parse(input)
json.validate[JsArray].map(println).getOrElse(println(json))

这里,如果JSONJsArray,它将进入map函数,否则(getOrElse(它将简单地打印它所具有的任何JSON值。

最新更新