我正在使用scala中的API模块,该模块查询数据库并以JSON格式返回获取的数据作为响应。
对于JSON(类型为Option[String]
)中的特定属性,我需要根据某些条件来更改从数据库中获取的值。
目前,我的JSON响应如下:
.....
{
"id": "1",
"name": "abc",
"osType": "windows",
"osVersion": "10.0.14393"
},
{
"id": "2",
"name": "xyz",
"osType": "ubuntu",
"osVersion": "18.04"
},
{
"id": "3",
"name": "pqr",
"osType": "windows",
"osVersion": "6.1.7601"
},
......
对于osVersion
,我需要将以下值替换为"osType": "windows"
if osVersion = 10.0.14393 , then Windows Server 2016
if osVersion starts with 6.1 , then Windows Server 2008 R2
因此所需的输出如下所示:
.....
{
"id": "1",
"name": "abc",
"osType": "windows",
"osVersion": "Windows Server 2016"
},
{
"id": "2",
"name": "xyz",
"osType": "ubuntu",
"osVersion": "18.04"
},
{
"id": "3",
"name": "pqr",
"osType": "windows",
"osVersion": "Windows Server 2008 R2"
},
......
我尝试使用if-else
和pattern-matching
,但是由于类型为Option[String]
,因此无法正确替代。
这是我尝试的方法:
(1)
def translateOSVersion (osType :Option[String] ,osVersion : Option[String]):Option[String] ={
if (osType == "windows"){
val version = if (osVersion =="10.0.14393")
{
Some("Windows Server 2016")
}
else {osVersion}
version
}
}
val oSVersion = translateOSVersion(ostr("osType") ,ostr("osVersion") )
<modelJSON>(id, name, ostr("osType"), oSVersion)
(2)
def translateOSVersion (osType :Option[String] ,osVersion : Option[String]) ={
if (osType == "windows"){
val version = if (osVersion =="10.0.14393") Some("Windows Server 2016")
else osVersion
}
}
val oSVersion = Some(translateOSVersion(ostr("osType") ,ostr("osVersion") ).toString)
<modelJSON>(id, name, ostr("osType"), oSVersion)
(3)
def translateOSVersion (osType :Option[String] ,osVersion : Option[String]) ={
if (osType == "windows"){
osVersion match {
case Some("10.0.14393") => "Windows Server 2016"
case x =>x
}
}
}
val oSVersion = Some(translateOSVersion(ostr("osType") ,ostr("osVersion") ).toString)
<modelJSON>(id, name, ostr("osType"), oSVersion)
所有方法均未获得理想的结果。 请在这里帮助。
答案 0 :(得分:2)
类似的事情应该起作用:
def translateOSVersion(osType: Option[String], osVersion: Option[String]): Option[String] =
(for {
ot <- osType if ot == "windows"
ov <- osVersion
} yield {
if (ov == "10.0.14393") {
"Windows Server 2016"
} else if (ov.startsWith("6.1")) {
"Windows Server 2008 R2"
} else {
ov
}
}) orElse osVersion
它是这样工作的:
for
语句创建一个代表更新的版本号的新Option[String]
,如果没有更改,则创建None
。通过将两个Option
值分别提取到OS类型的ot
和OS版本的ov
中来工作。如果Option
中的任何一个为None
,它将返回None
,并且如果OS类型不是“ windows”,它将返回None
。如果所有这些测试均通过,则yield
表达式将根据这些值来计算新版本。在这种情况下,for
将返回Some(x)
,其中x
是yield
表达式的值。
如果orElse
表达式为Some(x)
,它将返回第一个值,否则它将返回第二个值。因此,如果for
的结果为Some(x)
,则将其作为函数的结果返回。如果for
返回None
,则返回原始值作为结果。
这是一个比较平淡的版本,虽然不太有趣,但可能更合适!
def translateOSVersion(osType: Option[String], osVersion: Option[String]): Option[String] =
if (osType.contains("windows")) {
if (osVersion.contains("10.0.14393")) {
Some("Windows Server 2016")
} else if (osVersion.exists(_.startsWith("6.1"))) {
Some("Windows Server 2008 R2")
} else {
osVersion
}
} else {
osVersion
}