Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 使用字符串获取scala类的字段值而不进行反射?_Json_Scala - Fatal编程技术网

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)
)