我正在使用Scala。我对Scala不太熟悉,但是至少可以使用jackson
JSON解析器来工作。
现在,我有一个非常奇怪的问题。如果输入的JSON字符串有语法错误,则解析方法将挂起,不给出任何答案,也不例外。我使用此对象/方法,在正确的输入下效果很好:
import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper}
import org.json4s.jackson.JsonMethods.parse
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
object JsonHelper {
val internal_mapper = new ObjectMapper() with ScalaObjectMapper
internal_mapper.registerModule(DefaultScalaModule)
implicit def jsonStrToAny(jsonStr: String)(implicit m : Manifest[Any]): Any = {
internal_mapper.readValue[Any](jsonStr)
}
}
在代码中,我简单地称为:JsonHelper.jsonStrToAny("[{\"660\":false]")
此方法由名为onReceived
的kafka处理程序方法使用。 @Thilo指出,异常可能被调用代码“阻止”。难道这个kafka处理程序“吞噬”了异常?
private val checker = Consumer
.plainSource(consumerSettings, Subscriptions.topics(CHECK_REQUEST_TOPIC))
.toMat(Sink.foreach(onReceived))(Keep.both)
.mapMaterializedValue(DrainingControl.apply)
.run()
有人对我有暗示吗,为什么会这样?
先谢谢您
艾伦
答案 0 :(得分:0)
我找到了答案,这并不能真正令我满意。如果有人有解释,您可以随意评论。
一个简单的技巧是包装一个try-catch,即使没有先引发任何观念。现在,我可以检测到错误的输入字符串并进行处理。
implicit def jsonStrToAny(jsonStr: String)(implicit m: Manifest[Any]): Any = {
try {
internal_mapper.readValue[Any](jsonStr)
} catch {
case e: Exception => {
null
}
}
}
蓄积