将JsonArray与枚举进行比较

时间:2013-08-26 09:25:41

标签: json scala intellij-idea playframework-2.0 enumeration

我(scala初学者)正在搜索,但我找不到合适的方法来解决以下问题。

Enumeration对象(永不改变):

object EyeColorEnum extends Enumeration{
  val Blue = Value("blue")
  val Brown = Value("brown")
  val Gray = Value("gray")
  val Green = Value("green")
}

Json数组(case1):

"eyeColor": ["blue", "gray", "green"]

Json数组(case2):

"eyeColor": []

Json数组(案例3):

"eyeColor": ["orange", "pink", "green"]

此解决方案应该是“eyeColor”字段的json验证。

案例1和案例2有效。

案例3无效。

for (i <- 1 to(jsonArray.value.length - 1)) {     
  for (j <- 1 to(jsonArray.value.length - 1)) {
    if(jsonArray(i).as[String] == enumArray(j).toString) {
      // Item from A exists in B
      true
    } else {
      // Item from A does not exist in B
      checker = checker + 1
    }
  }
}

这些for不起作用,我希望它们如何工作。 是否有更简单的方法可以完成这项工作?

非常感谢你。

2 个答案:

答案 0 :(得分:0)

这不起作用的原因在于,以这种方式使用的理解是对.pare中创建的Range实例进行.foreach调用(返回Unit而不是您尝试返回的值):

(1 to (jsonArray.value.length - 1)).foreach{i => ...}

听起来你想要一个spalal和scala中的集合提供的存在方法的组合。

答案 1 :(得分:0)

是否有人可以指出如何避免var

这是我难看的解决方案:

def apply(enum: Enumeration, jsonArray: JsArray): Boolean = {
    val enumArray  = enum.values.toArray
    var found = 0
    jsonArray.value.length  match {
      case 0 => true
      case _ =>
        (0 to (jsonArray.value.length - 1)).foreach{i =>
          (0 to (enumArray.length - 1)).foreach{j =>
            if (jsonArray(i).as[String] == enumArray(j).toString) {
              found +=1
            }
          }
        }
      found == jsonArray.value.length
    }
  }