Разбор JSON дает исключение JsResultException - PullRequest
1 голос
/ 26 сентября 2019

Я пытаюсь проанализировать 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)

1 Ответ

1 голос
/ 26 сентября 2019

Проблема в том, что параметры должны иметь тип 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...