我有这样一个设置,我想从一个XML NodeSeq填充一个对象字段。显示了我的设置的简化版本。它工作得很好,但当我把None
放在testObj
中时,我得到一个java.util.NoSuchElementException: None.get
。
我认为问题在于,当None
为None
时,我无法找到获取Option[_]
的类的方法。我被困在这件事上很久了,我看不到出路。我觉得当原始值为None
时,必须有一种方法来分支和填充Object字段,但如何进行呢?
import xml.NodeSeq
object test {
case class TestObject(name: Option[String] = None, value: Option[Double] = None)
def main(args: Array[String]): Unit = {
val testObj = TestObject(Some("xxx"), Some(12.0))
// val testObj = TestObject(None, Some(12.0))
val nodeSeq = <test> <name> yyy </name> <value> 34.0 </value> </test>
val result = getObject[TestObject](nodeSeq, Option(testObj))
println("result = " + result) // result = Some(TestObject(Some(yyy),Some(34.0)))
}
def getObject[A](nodeSeq: NodeSeq, obj: Option[A]): Option[A] = {
if ((nodeSeq.isEmpty) || (!obj.isDefined)) None else {
for (field <- obj.get.getClass.getDeclaredFields) {
field.setAccessible(true)
val fieldValue = field.get(obj.get)
if (fieldValue == null || !fieldValue.isInstanceOf[Option[_]]) None
var newValue: Option[_] = None
fieldValue.asInstanceOf[Option[_]].get match { // <---- None.get is the error here
case x: Double => newValue = Some((nodeSeq \ field.getName).text.trim.toDouble)
case x: String => newValue = Some((nodeSeq \ field.getName).text.trim)
}
val decField = obj.get.getClass.getDeclaredField(field.getName)
decField.setAccessible(true)
decField.set(obj.get, newValue)
}
obj
}
}
}
2条答案
按热度按时间9ceoxa921#
我忽略了这段代码中我不喜欢的其他部分,但是,您不能对None调用
.get
。您可以调用map,它将返回我认为您想要的结果。以下是修改后的代码:在实践中,我通常避免对选项调用
.get
,因为它经常导致错误。更新:
这个版本的功能更强大一些,但它仍然会更改您发送的obj:
xoshrz7s2#
实际上,这可能更接近您想要的结果:请检查字段的类型。
创建新对象的版本(可能需要根据您的要求进行修改):