Playframework 播放Json-将嵌套Json数组与Specs2进行比较

Playframework 播放Json-将嵌套Json数组与Specs2进行比较,playframework,specs2,play-json,Playframework,Specs2,Play Json,使用Play Json和Specs2,我可以像这样匹配Json主体: contentAsJson(res) must equalTo(responseBody) 是否有可能忽略json数组的顺序(递归),而将json数组的相等性视为集合?需要做一些工作,这取决于您希望失败消息的好坏。你可以这样做 import org.specs2._ import execute._ import matcher._ import play.api.libs.json._ trait JsValueMatc

使用Play Json和Specs2,我可以像这样匹配Json主体:

contentAsJson(res) must equalTo(responseBody)

是否有可能忽略json数组的顺序(递归),而将json数组的相等性视为集合?

需要做一些工作,这取决于您希望失败消息的好坏。你可以这样做

import org.specs2._
import execute._
import matcher._
import play.api.libs.json._

trait JsValueMatchers extends MustMatchers {
  def beEqualj(expected: JsValue): Matcher[JsValue] = { actual: JsValue =>
    (actual, expected) match {
      case (JsArray(as), JsArray(es)) =>
        asPair(as must contain(allOf(es.map(beEqualj):_*)).exactly)

      case (JsObject(as), JsObject(es)) =>
        asPair(as must contain(allOf(es.toList.map(pairEqualj):_*)).exactly.inOrder)

      case (JsNull, JsNull) =>
        (true, "ko")

      case (JsBoolean(a), JsBoolean(e)) =>
        (a == e, s"ko: $a is not equal to $e")

      case (JsString(a), JsString(e)) =>
        (a == e, s"ko: $a is not equal to $e")

      case (JsNumber(a), JsNumber(e)) =>
        (a == e, s"ko: $a is not equal to $e")

      case _ =>
        (false, s"$actual and $expected don't have the same type")
    }
  }

  def pairEqualj(expected: (String, JsValue)): Matcher[(String, JsValue)] = { actual: (String, JsValue) =>
    val (key, value) = actual
    val result = (key must_== expected._1) and
      (value must beEqualj(expected._2))
    asPair(result)
  }

  def asPair[R : AsResult](r: R): (Boolean, String) = {
    val result = AsResult(r)
    (result.isSuccess, result.message)
  }
}

object JsValueMatchers

您可以将json转换为case类,并将它们作为集合进行比较:

contentAsJson(res).as[Set[User]] must equalTo(Json.parse(responseBody).as[Set[User]])

非常感谢你。看起来很有希望。在尝试编译时,我只得到一个错误:
found:Iterable[org.specs2.matcher.matcher[(String,play.api.libs.json.JsValue)]]必需的:Seq[org.specs2.matcher.ValueCheck[?]]从stdout:asPair读取(as必须包含(allOf(es.map(pairEqualj):*)。正是.inOrder)
很抱歉,我现在修复了编译错误。