是否有可能使json4s不抛出异常必填字段时失踪了?(Is it possible to make

2019-08-21 17:01发布

是否有可能使json4s不抛出异常必填字段时失踪了?

当我“提取”从原始JSON字符串对象时,它抛出异常,像这样的

org.json4s.package$MappingException: No usable value for pager
No usable value for rpp
Did not find value which can be converted into byte
    at org.json4s.reflect.package$.fail(package.scala:98)
    at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$buildCtorArg(Extraction.scala:388)
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$11.apply(Extraction.scala:396)

是否有可能只是让它为空?

Answer 1:

这很简单,你必须使用Option和它的潜力, SomeNone

val json = ("name" -> "joe") ~ ("age" -> Some(35));
val json = ("name" -> "joe") ~ ("age" -> (None: Option[Int]))

要小心的是,在上述情况下, match会为您进行Option 。 如果是None ,这将完全从字符串删除,这样就不会反馈空。

在相同的模式,来解析不完整的JSON,你用一个case classOption

case class someModel(
    age: Option[Int],
    name: Option[String]
);
val json = ("name" -> "joe") ~ ("age" -> None);
parse(json).extract[someModel];

还有,不会引发任何异常的方法,那就是extractOpt

parse(json).extractOpt[someModel];

复制与斯卡拉API的一种方法是使用scala.util.Try

Try { parse(json).extract[someModel] }.toOption


Answer 2:

我已经与数据迁移打交道时处理这个问题,我想填充默认值,不确定的领域。

我的解决办法提取结果之前合并默认进入JValue。

  val defaultsJson = Extraction.decompose(defaults)
  val valueJson = JsonUtil.jValue(v)
  (defaultsJson merge valueJson).extract[T]

JsonUtil.scala

  import org.json4s._

  object JsonUtil {
    import java.nio.charset.StandardCharsets.UTF_8
    import java.io.{InputStreamReader, ByteArrayInputStream}

    def jValue(json: String): JValue = {
      jValue(json.getBytes(UTF_8))
    }

    def jValue(json: Array[Byte]): JValue = {
      val reader = new InputStreamReader(new ByteArrayInputStream(json), UTF_8)
      native.JsonParser.parse(reader)
    }
  }


文章来源: Is it possible to make json4s not to throw exception when required field is missing?
标签: scala json4s