在Json4s中解析json时,如何知道遗漏了哪个字段

umuewwlo  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(146)

我已经做了一个泛型方法,它可以将json解析为case类,并且它也可以正常工作。但是如果尝试解析具有一个或两个强制字段的大json,那么我无法找出缺少哪个特定的强制字段。我只能使用IllegalArgumentException处理它。有没有一种方法可以在使用json 4s解析Json时知道缺少哪个字段?
下面是我的代码-〉

object JsonHelper {

  implicit val formats: DefaultFormats = DefaultFormats

  def write[T <: AnyRef](value: T): String = jWrite(value)

  def parse(value: String): JValue = jParser(value)

}

这就是我用来解析Json和处理失败案例的方法-〉

def parseJson[M](json: String)(implicit m: Manifest[M]): Either[ErrorResponse, M] = {
    try
      Right(JsonHelper.parse(json).extract[M])
    catch {
      case NonFatal(th) =>
        th.getCause.getCause match {
          case e: java.lang.IllegalArgumentException =>
            error(s"Invalid JSON - $json", e)
            Left(handle(exception = EmptyFieldException(e.getMessage.split(":").last)))
          case _ =>
            error(s"Invalid JSON - $json", th)
            Left(handle(exception = new IllegalArgumentException("Invalid Json", th)))
        }
    }
  }

就像一个Json -〉

{
   "name": "Json"
}

和病例分类-〉

case class(name: String, profession: String)

如果我尝试将上述json解析为case类,当前我得到的是Invalid JSON - IllegalArgumentException。但是否有一种方法可以让异常告诉哪个字段丢失,如上面的示例"profession"丢失。

txu3uszq

txu3uszq1#

在使用json4s解析Json时,是否有一种方法可以知道缺少哪个字段?
也许你有更复杂的设置,但例如

import org.json4s._
import org.json4s.jackson.JsonMethods._

val str = """{
             |  "name": "Json"
             |}""".stripMargin

val json = parse(str) // JObject(List((name,JString(Json))))

implicit val formats: Formats = DefaultFormats

case class MyClass(name: String, profession: String)

json.extract[MyClass]

它产生了

org.json4s.MappingException: No usable value for profession
Did not find value which can be converted into java.lang.String
    at org.json4s.reflect.package$.fail(package.scala:56)
    at ...

具有缺失字段的名称,并且如果类只是case class MyClass(name: String),则这产生MyClass(Json)
如果类是case class MyClass(name: String, profession: Option[String]),则生成MyClass(Json,None)

相关问题