You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断JsArray中存储的是对象还是string、boolean等简单类型

实现JsValue参数处理函数的方案

你可以基于Play JSON库提供的JsValue子类类型判断来实现需求,以下是两种实现方式:

方式1:兼容你现有代码框架的实现

直接在你原有if-else结构中补充数组元素类型判断逻辑即可:

import play.api.libs.json._

def myFunc(json: JsValue): JsArray = {
    if (json.isInstanceOf[JsArray]) {
      val arr = json.asInstanceOf[JsArray]
      // 判断数组元素类型,默认按数组元素类型统一的规则判断,可按需调整
      val isObjectArray = arr.value.headOption.exists(_.isInstanceOf[JsObject])
      
      if (isObjectArray) {
        println("this is an array with objects")
      } else {
        println("this is an array with simple types")
      }
      arr
    } else {
      // 注意:原有写法JsArray(json)不符合参数要求,需要将单个元素包裹为IndexedSeq
      JsArray(IndexedSeq(json))
    }
}

方式2:更符合Scala开发习惯的模式匹配实现

用模式匹配替代isInstanceOf类型判断,代码更简洁安全:

import play.api.libs.json._

def myFunc(json: JsValue): JsArray = json match {
  case arr: JsArray =>
    val isObjectArray = arr.value.headOption.exists(_.isInstanceOf[JsObject])
    if (isObjectArray) {
      println("this is an array with objects")
    } else {
      println("this is an array with simple types")
    }
    arr
  case nonArray => JsArray(IndexedSeq(nonArray))
}

不同判断规则的调整方法

默认实现是假设数组元素类型统一,仅判断第一个元素类型。你可以根据业务需求调整判断规则:

  • 严格判定所有元素都是对象才为对象数组:将isObjectArray赋值改为
    val isObjectArray = arr.value.forall(_.isInstanceOf[JsObject])
    
  • 只要存在一个对象就判定为对象数组:将isObjectArray赋值改为
    val isObjectArray = arr.value.exists(_.isInstanceOf[JsObject])
    

内容的提问来源于stack exchange,提问作者JohnBigs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:06:04