如何判断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
相关产品推荐
相关产品推荐

