2013-04-11 60 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) 
    } 
    } 
相關問題