繁体   English   中英

如果json不包含字段,如何使json4s提取失败

[英]How can I make json4s extract fail if json doesn't contain field

我有一个case类,它只是这样的集合的包装:

case class MyClass(list: List[String])

如果我现在尝试将一些任意json反序列化为这种情况下的类,那么如果列表字段丢失,它不会失败。 是否有可能在提取过程中强制其失败?

代码示例:

import org.json4s.jackson.JsonMethods.parse

implicit val formats = org.json4s.DefaultFormats

val json = parse("""{ "name": "joe" }""")

case class MyClass(list: List[String])

val myClass = json.extract[MyClass] // Works!
assert(myClass.list.isEmpty)


case class MyClass2(test: String)
val myClass2 = json.extract[MyClass2] // Fails!

我需要它对缺少的列表字段失败,就像对字符串字段一样。 请帮忙。 谢谢!

解:

您可以创建MyClass反序列化器以使用List字段反序列化MyClass ,例如:

  class MyClassSerializer extends Serializer[MyClass] {
    private val MyClassClass = classOf[MyClass]

    override def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), MyClass] = {
      case (TypeInfo(MyClassClass, _), json) => json match {
        case JObject(JField("list", JArray(l)) :: _) =>
          MyClass(l.map(i => i.extract[String]))
        case x => throw new MappingException("Can't convert " + x + " to MyClass")
      }
    }

    override def serialize(implicit format: Formats): PartialFunction[Any, JValue] = ???
  }

缺少List字段的原因无法使用Exception解析,位于Extraction.scala中

  private class CollectionBuilder(json: JValue, tpe: ScalaType)(implicit formats: Formats) {
    private[this] val typeArg = tpe.typeArgs.head
    private[this] def mkCollection(constructor: Array[_] => Any) = {
      val array: Array[_] = json match {
        case JArray(arr)      => arr.map(extract(_, typeArg)).toArray
        case JNothing | JNull => Array[AnyRef]()
        case x                => fail("Expected collection but got " + x + " for root " + json + " and mapping " + tpe)
      }

      constructor(array)
    }

我们可以看到上面的代码片段,当我们遇到case类中的一个集合时, Json4S将通过构造函数参数name( list )检索Json AST中的字段,如果找不到参数name( list ),它将将返回JNothing ,但是对于上面的代码片段中的JNothing ,它将创建一个新的集合( case JNothing | JNull => Array[AnyRef]() )而不会case JNothing | JNull => Array[AnyRef]()错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM