Json 使用字符串获取scala类的字段值而不进行反射?
给定字符串Json 使用字符串获取scala类的字段值而不进行反射?,json,scala,Json,Scala,给定字符串“fieldA”,我想得到foo.fieldA的值,即Some(1.0)。由于代码将用于生产,是否可以不使用反射?我想简短的回答是“否” 一个稍微长一点的答案是,如果您想从任何元素检索字段,只使用带有该元素名称的字符串,那么您必须使用反射 也就是说,您可以编写一个查找函数,如下所示: case类Foo(fieldA:Option[Double],fieldB:Option[Double]){ //... def byFieldName(名称:字符串):选项[Double]=名称匹配{
“fieldA”
,我想得到foo.fieldA
的值,即Some(1.0)
。由于代码将用于生产,是否可以不使用反射?我想简短的回答是“否”
一个稍微长一点的答案是,如果您想从任何元素检索字段,只使用带有该元素名称的字符串,那么您必须使用反射
也就是说,您可以编写一个查找函数,如下所示:
case类Foo(fieldA:Option[Double],fieldB:Option[Double]){
//...
def byFieldName(名称:字符串):选项[Double]=名称匹配{
案例“fieldA”=>fieldA
案例“fieldB”=>fieldB
}
}
这有点像手动操作,但它可以工作。或者,您可以使用反射实现此函数,将结果缓存在Map[String,Option[Double]]
中(假设所有此类字段的类型相同)。这样,对于每个查找字段,您只会获得一次性能命中
更新:我应该指出,无论如何,这可能不是你想要的。如果您需要按名称检索字段值,下面的方法是否可以代替case类
(在Scala REPL中演示)
scala>type Foo=Map[String,Option[Double]]
定义的类型别名Foo
scala>valfoo:foo=Map(“fieldA”->Some(1.0),“fieldB”->Some(2.0))
foo:foo=Map(fieldA->Some(1.0),fieldB->Some(2.0))
scala>foo(“fieldA”)
res0:Option[Double]=Some(1.0)
也就是说,您可以使用
映射
数据结构来查找标记的值吗?不确定“不使用反射”是什么意思。您可以使用foo.fieldA.get
返回1.0
。在您的示例代码中,fieldA
是Some(1.0)
而不是Some(2.0)
@jwvh谢谢。更新了。@Brian当提供了“fieldA”
时,我真的不知道我需要的是foo.fieldA
。所以问题是如何从字符串中获取foo.fieldA
。非常感谢您的启发。我正在考虑将案例类
转换为映射
,但我想“手动解决方案”最有效。谢谢!!!!:)
case class Foo {
fieldA: Option[Double],
fieldB: Option[Double]
}
val foo = Foo(
fieldA = Some(1.0),
fieldB = Some(2.0)
)