我正在尝试解析一个可能有也可能没有字段的JSON。所以我做了现场选择。但是当我尝试解析JSON时JsResultException
import java.nio.charset.StandardCharsets
import play.api.libs.json
import play.api.libs.json.Json
case class Test(field1: String , field2: Seq[String] = Seq.empty[String])
object Test{
implicit val format = Json.format[Test]
}
val t = Test("1")
println(s"here = ${t.field2}")
val test = """""{"field1":"test1"}"""""""
//Json.fromJson[Test](Json.parse(test), T)
Json.parse(test).as[Test]
例外:
play.api.libs.json.JsResultException: JsResultException(errors:List((/field1,List(ValidationError(List(error.path.missing),WrappedArray()))), (/field2,List(ValidationError(List(error.path.missing),WrappedArray())))))
at play.api.libs.json.JsReadable$$anonfun$2.apply(test2.sc:19)
at play.api.libs.json.JsReadable$$anonfun$2.apply(test2.sc:19)
at play.api.libs.json.JsResult$class.fold(test2.sc:69)
at play.api.libs.json.JsError.fold(test2.sc:9)
at play.api.libs.json.JsReadable$class.as(test2.sc:17)
at play.api.libs.json.JsString.as(test2.sc:42)
at com.rallyhealth.healthvault.files.dao.A$A1$A$A1.get$$instance$$res0(test2.sc:21)
at #worksheet#.#worksheet#(test2.sc:54)
试过这个
import play.api.libs.json
import play.api.libs.json.Json
case class Test(field1: String = "", field2: Seq[String] = Seq.empty[String])
object Test {
def main(args: Array[String]): Unit ={
implicit val jsonFormat: json.Format[Test] = Json.using[Json.WithDefaultValues].format[Test]
val test = """""{"field1":"test1"}"""""""
//Json.fromJson[Test](Json.parse(test), T)
val value = Json.parse(test).as[Test]
println(value)
}
}
我仍然低于例外
Exception in thread "main" play.api.libs.json.JsResultException: JsResultException(errors:List((,List(JsonValidationError(List(error.expected.jsobject),WrappedArray())))))
at play.api.libs.json.JsReadable.$anonfun$as$2(JsReadable.scala:25)
at play.api.libs.json.JsError.fold(JsResult.scala:56)
at play.api.libs.json.JsReadable.as(JsReadable.scala:24)
at play.api.libs.json.JsReadable.as$(JsReadable.scala:23)
at play.api.libs.json.JsString.as(JsValue.scala:86)
at kavya.Test$.main(GetOrElse.scala:18)
at kavya.Test.main(GetOrElse.scala)
问题在于参数必须是类型Option
,并且可以正常工作。
case class Test(field1: Option[String], field2: Option[Seq[String]])
最简单的解决方案是如果您不想更改签名,则设置默认值:
case class Test(field1: String = "", field2: Seq[String] = Seq.empty[String])
implicit val jsonFormat: Format[Test] = Json.using[Json.WithDefaultValues].format[Test]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句