Is it possible to make json4s not to throw exception when required field is missing?

前端 未结 2 414
耶瑟儿~
耶瑟儿~ 2021-01-04 03:15

Is it possible to make json4s not to throw exception when required field is missing ?

When I \"extract\" object from raw json string it throws exception like this on

相关标签:
2条回答
  • 2021-01-04 03:55

    It's quite simple, you have to use Option and its potentials, Some and None.

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

    Beware though, in the above case a match will be performed for your Option. If it's None, it will be completely removed from the string, so it won't feed back null.

    In the same pattern, to parse incomplete JSON, you use a case class with Option.

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

    There is a method which won't throw any exception, and that is extractOpt

    parse(json).extractOpt[someModel];
    

    A way to replicate that with the scala API would be to use scala.util.Try:

    Try { parse(json).extract[someModel] }.toOption
    
    0 讨论(0)
  • 2021-01-04 04:15

    I've dealt with this problem when dealing with data migrations, and I wanted default values to fill undefined fields.

    My solution was to merge the defaults into the JValue before extracting the result.

      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)
        }
      }
    
    0 讨论(0)
提交回复
热议问题