【问题标题】:Is it possible to make json4s not to throw exception when required field is missing?当缺少必填字段时,是否可以让 json4s 不抛出异常?
【发布时间】:2013-04-03 08:43:09
【问题描述】:

是否可以让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)

是否可以让它为空?

【问题讨论】:

    标签: scala json4s


    【解决方案1】:

    这很简单,你必须使用Option 及其潜力,SomeNone

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

    但请注意,在上述情况下,将为您的 Option 执行 match。如果是None,则会完全从字符串中移除,所以不会反馈null。

    在相同的模式中,要解析不完整的 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];
    

    使用 scala API 复制它的一种方法是使用 scala.util.Try:

    Try { parse(json).extract[someModel] }.toOption
    

    【讨论】:

      【解决方案2】:

      我在处理数据迁移时已经处理过这个问题,我希望使用默认值来填充未定义的字段。

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

      【讨论】:

        猜你喜欢
        • 2012-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-02
        相关资源
        最近更新 更多