[英]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.