Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要映射的Json对象_Json_Scala_Play Json - Fatal编程技术网

要映射的Json对象

要映射的Json对象,json,scala,play-json,Json,Scala,Play Json,您好,我想使用隐式读取将json对象转换为映射。 使用下面的代码,我遇到了StackOverflow错误,任何人都可以看到问题所在: "pass": { "key-1": { "field1": "aaaa", "field2": "aaaa" }, "key-2": { "field1": "aaaa", "field2": "aaaa" }, "key-3": { "field1": "aaaa", "field2": "a

您好,我想使用隐式读取将json对象转换为映射。 使用下面的代码,我遇到了StackOverflow错误,任何人都可以看到问题所在:

"pass": {
  "key-1": {
    "field1": "aaaa",
    "field2": "aaaa"
  },
  "key-2": {
    "field1": "aaaa",
    "field2": "aaaa"
  },
  "key-3": {
    "field1": "aaaa",
    "field2": "aaaa"
  }
}

case class Pass(field1: String, field2: String)

implicit val mapReads: Reads[Map[String, Pass]] = new Reads[Map[String, Pass]] {
  def reads(jv: JsValue): JsResult[Map[String, Pass]] =
    JsSuccess(jv.as[Map[String, Pass]].map{
      case (k, v) => k -> v.asInstanceOf[Pass]
    })
}

val passMap = (json \ "pass").validate[Map[String, Pass]]
以下是堆栈错误:

java.lang.StackOverflowError
  at play.api.libs.json.JsReadable$class.as(JsReadable.scala:23)
  at play.api.libs.json.JsObject.as(JsValue.scala:124)
  at com.MyHelper$$anon$1.reads(MyHelper.scala:51)
  at play.api.libs.json.Format$$anon$3.reads(Format.scala:65)
  at play.api.libs.json.JsValue$class.validate(JsValue.scala:17)
  at play.api.libs.json.JsObject.validate(JsValue.scala:124)
  at play.api.libs.json.JsReadable$class.as(JsReadable.scala:23)
  at play.api.libs.json.JsObject.as(JsValue.scala:124)

也许您更有可能创建一个MapPass类案例,并使用Json.format为您完成这项工作

import play.api.libs.json._

val a: String = """{
  "pass": {
    "key-1": {
    "field1": "aaaa",
    "field2": "aaaa"
  },
    "key-2": {
    "field1": "aaaa",
    "field2": "aaaa"
  },
    "key-3": {
    "field1": "aaaa",
    "field2": "aaaa"
  }
  }
}"""

case class Pass(field1: String, field2: String)

case class MapPass(pass: Map[String, Pass])

implicit val passFormat: Format[Pass] = Json.format[Pass]
implicit val mapPassFormat: Format[MapPass] = Json.format[MapPass]

val json = Json.parse(a)
val mapPassJsResult = json.validate[MapPass]
val mapPass = mapPassJsResult.get
print(mapPass.pass.mkString("\n"))
对我来说是这样的:


我尝试了你的代码,得到了错误
JsError(List(/pass,List(JsonValidationError(List(error.path.missing),WrappedArray())))
在我的示例中,我简化了json,但真正的json更大,我必须使用
(json\“pass”)提取pass。验证[MapPass]
不可能是我给了你一个错误,我插入了一个带有示例预览的Scala工作表。。。对于任何大小,您都可以使用json.format宏,只要它是一个case类,并且不传递22个字段