如何检查 JsArray 是否包含对象或简单类型?

How to check if JsArray holds Objects or Simple types?

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

  1. 检查它是否是数组类型
  2. 如果它不是数组,return 列表中的值
  3. 如果它是数组,检查它的数组是对象还是简单类型(字符串、布尔值等)
  4. 如果它的简单类型数组 return 这个数组并打印“这是一个简单类型的数组”
  5. 如果它的对象数组 return 这个数组并打印“这是一个包含对象的数组”

所以像这样:

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. if its NOT Array, return the value inside a list
def myFunc(json: JsValue): JsArray =
  json match {
    case JsArray(members) => ???
    case _ => JsArray(Array(json))
  }
  1. if its Array of simple type return this Array and print "this is an array with simple types"
  2. if its Array of objects return this Array and print "this is an array with objects"

围绕歧义做出一些假设(空数组?简单数组和对象?嵌套数组?):

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))

这里如果 JSON 属于 JsArray 它将进入 map 函数,否则 (getOrElse) 它只会打印任何 JSON它具有的价值。