2013-04-11 35 views
13

是否有可能使json4s不会抛出异常,当需要的领域缺失?是否有可能让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) 

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

回答

17

这很简单,你必须使用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 
4

我在处理数据迁移时处理了这个问题,并且我想要默认值来填充未定义的字段。

我的解决方案是在提取结果之前将默认值合并到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) 
    } 
    } 
相关问题