如何检查 JsArray 是否包含对象或简单类型?
How to check if JsArray holds Objects or Simple types?
我需要编写一个接收 JsValue 的函数,并执行以下步骤:
- 检查它是否是数组类型
- 如果它不是数组,return 列表中的值
- 如果它是数组,检查它的数组是对象还是简单类型(字符串、布尔值等)
- 如果它的简单类型数组 return 这个数组并打印“这是一个简单类型的数组”
- 如果它的对象数组 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
}
- if its NOT Array, return the value inside a list
def myFunc(json: JsValue): JsArray =
json match {
case JsArray(members) => ???
case _ => JsArray(Array(json))
}
- if its Array of simple type return this Array and print "this is an array with simple types"
- 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它具有的价值。
我需要编写一个接收 JsValue 的函数,并执行以下步骤:
- 检查它是否是数组类型
- 如果它不是数组,return 列表中的值
- 如果它是数组,检查它的数组是对象还是简单类型(字符串、布尔值等)
- 如果它的简单类型数组 return 这个数组并打印“这是一个简单类型的数组”
- 如果它的对象数组 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
}
- if its NOT Array, return the value inside a list
def myFunc(json: JsValue): JsArray =
json match {
case JsArray(members) => ???
case _ => JsArray(Array(json))
}
- if its Array of simple type return this Array and print "this is an array with simple types"
- 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它具有的价值。