我需要编写一个接收JsValue的函数,并执行以下步骤:
- 检查其类型是否为Array
- 如果是NOT数组,则返回列表中的值
- 如果它是数组,请检查它的对象数组或简单类型(字符串、布尔值等(
- 如果其简单类型的Array返回该Array;这是一个具有简单类型"的数组
- 如果其对象数组返回该数组并打印"数组";这是一个带有对象"的数组
所以类似这样的东西:
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
}
- 如果它是NOT数组,则返回列表中的值
def myFunc(json: JsValue): JsArray =
json match {
case JsArray(members) => ???
case _ => JsArray(Array(json))
}
- 如果其简单类型的Array返回此Array并打印";这是一个具有简单类型"的数组
- 如果其对象数组返回该数组并打印"数组";这是一个带有对象"的数组
围绕模糊性(空数组?简单数组和对象?嵌套数组?(做出一些假设:
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值。