Scala中用JsonPath提取event_type字段遇异常,求单行解决方案
嘿,我来帮你搞定这个问题!
问题原因分析
你遇到的异常核心在于:当尝试直接用单行代码提取event_type时,JsonPath判定$.message_metadata是字符串类型而非JSON对象。这和你分两步操作的逻辑形成了对比:
- 分两步时,你先把
message_metadata作为JSON字符串提取出来,再对这个字符串做二次解析,自然能顺利拿到event_type; - 但单行直接访问
$.message_metadata.event_type时,JsonPath会试图从"字符串"里找event_type属性,这显然不符合JSON结构规则,所以抛出了异常。
单行解决方案
你可以把两步的逻辑合并成一行代码,本质是先提取message_metadata的JSON字符串,再立即对它解析提取event_type:
val eventType = JsonPath.read[String](JsonPath.read[String](jsonString, "$.message_metadata"), "$.event_type")
或者用更优雅的链式调用方式(利用JsonPath的parse方法):
import com.jayway.jsonpath.JsonPath val eventType = JsonPath.parse(jsonString) .read[String]("$.message_metadata") .pipe(jsonMeta => JsonPath.read[String](jsonMeta, "$.event_type"))
额外说明:如果原始JSON的message_metadata本就是对象
如果你提供的JSON确实是message_metadata为对象的格式,却依然报错,那可能是JsonPath的配置或版本存在解析问题。这种情况下你可以尝试直接指定正确的路径和返回类型:
val eventType = JsonPath.read[String](jsonString, "$.message_metadata.event_type")
如果还是报错,建议检查你的jsonString是否实际把message_metadata序列化成了带转义引号的字符串格式——这种情况就必须用前面提到的合并两步的写法。
内容的提问来源于stack exchange,提问作者Jhutan Debnath
相关产品推荐
相关产品推荐

