是否有可能使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)
Run Code Online (Sandbox Code Playgroud)
是否可以让它为空?
fla*_*ian 17
这很简单,你必须使用Option它的潜力,Some而且None.
val json = ("name" -> "joe") ~ ("age" -> Some(35));
val json = ("name" -> "joe") ~ ("age" -> (None: Option[Int]))
Run Code Online (Sandbox Code Playgroud)
但请注意,在上述情况下,match将为您执行Option.如果是None,它将从字符串中完全删除,因此它不会反馈null.
在相同的模式中,要解析不完整的JSON,请使用case classwith Option.
case class someModel(
age: Option[Int],
name: Option[String]
);
val json = ("name" -> "joe") ~ ("age" -> None);
parse(json).extract[someModel];
Run Code Online (Sandbox Code Playgroud)
有一种方法不会抛出任何异常,就是这样 extractOpt
parse(json).extractOpt[someModel];
Run Code Online (Sandbox Code Playgroud)
使用scala API复制它的方法是使用scala.util.Try:
Try { parse(json).extract[someModel] }.toOption
Run Code Online (Sandbox Code Playgroud)
小智 6
我在处理数据迁移时遇到了这个问题,我希望默认值填充未定义的字段.
我的解决方案是在提取结果之前将默认值合并到JValue中.
val defaultsJson = Extraction.decompose(defaults)
val valueJson = JsonUtil.jValue(v)
(defaultsJson merge valueJson).extract[T]
Run Code Online (Sandbox Code Playgroud)
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)
}
}
Run Code Online (Sandbox Code Playgroud)