【问题标题】:How to check if JsArray holds Objects or Simple types?如何检查 JsArray 是否包含对象或简单类型?
【发布时间】:2021-11-17 12:52:16
【问题描述】:

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

  1. 检查其是否为数组类型
  2. 如果不是数组,则返回列表中的值
  3. 如果是数组,检查它的数组是对象还是简单类型(字符串、布尔值等)
  4. 如果它的简单类型数组返回这个数组并打印“这是一个简单类型的数组”
  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)
    }
}

谢谢!

【问题讨论】:

  • 如果它同时包含对象和简单类型怎么办?如果它包含对象或简单类型以外的东西(例如数组、函数)怎么办?

标签: scala play-json


【解决方案1】:

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

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

def myFunc(json: JsValue): JsArray =
  json match {
    // Fill in cases later
  }
  1. 如果不是数组,则返回列表中的值
def myFunc(json: JsValue): JsArray =
  json match {
    case JsArray(members) => ???
    case _ => JsArray(Array(json))
  }
  1. 如果它的简单类型数组返回这个数组并打印“这是一个简单类型的数组”
  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))
  }

【讨论】:

    【解决方案2】:

    可以使用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 值。

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 2022-11-09
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      相关资源
      最近更新 更多