是否有可能使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)
是否有可能只是让它为空?
这很简单,你必须使用Option
和它的潜力, Some
和None
。
val json = ("name" -> "joe") ~ ("age" -> Some(35));
val json = ("name" -> "joe") ~ ("age" -> (None: Option[Int]))
要小心的是,在上述情况下, match
会为您进行Option
。 如果是None
,这将完全从字符串删除,这样就不会反馈空。
在相同的模式,来解析不完整的JSON,你用一个case class
与Option
。
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
我已经与数据迁移打交道时处理这个问题,我想填充默认值,不确定的领域。
我的解决办法提取结果之前合并默认进入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?