我正在尝试点击API并检索JSON。我试图迭代记录并尝试获取结果。问题是以下是被填充为错误的警告。我不想将它们作为警告,但要找出可能匹配的解决方案可能不是唯一的错误消息。
case class Results(network: String,entity: String)
val jsonStr=parse(content)
val results = for {
JArray(results) <- jsonStr
JObject(result) <- results
JField("network",JString(network)) <- result
JField("entityId",JString(entityId)) <- result
} yield Results(network,entityId)
输出:
[error] /home/jenkins/builds/workspace/ProjectName/core/src/main/scala/Settlement_Feed.scala:42: match may not be exhaustive.
[error] It would fail on the following inputs: JArray(_), JBool(_), JDouble(_), JField(_, _), JInt(_), JNothing, JNull, JString(_)
[error] JObject(result) <- results
[error] ^
[error] /home/jenkins/builds/workspace/ProjectName/core/src/main/scala/Settlement_Feed.scala:41: match may not be exhaustive.
[error] It would fail on the following inputs: JBool(_), JDouble(_), JField(_, _), JInt(_), JNothing, JNull, JObject(_), JString(_)
[error] JArray(results) <- jsonStr
[error]
[error] two errors found
我曾尝试过阅读liftjson和scala文档,但无法找到很多有价值的信息来解决错误。 我试过保持if循环并尝试检查jsonstr的实例,但它没有工作。 任何建议都非常感谢。非常感谢。
答案 0 :(得分:0)
在这种情况下,你不能在里面使用模式匹配来理解,因为它只允许你匹配一个模式。而是转换为flatMap
:
jsonStr match {
case JArray(results) =>
results.flatMap {
case JObject(result) =>
val networkOpt = result.collectFirst {
case JField("network", JString(network)) => network
}
val entityIdOpt = result.collectFirst {
case JField("entityId", JString(entityId)) => entityId
}
(networkOpt, entityIdOpt) match {
case (Some(network), Some(entityId)) => Some(network, entityId)
case _ => ???
}
case _ => ???
}
case _ => ???
}
请注意,在这些情况下,您需要将???
替换为您想要执行的操作(如果没有network
或entityId
字段,如果results
包含如果jsonStr
不是数组,则不是对象的值。