在 Scala 中使用杰克逊映射器从 Json 字符串中提取字段



我有一个json字符串:

val message = "{"me":"a",
    "version":"1.0",
    "message_metadata": "{
                          "event_type":"UpdateName",
                          "start_date":"1515"}"
    }"

我想从这个 json 字符串中提取字段event_type的值。我使用以下代码来提取值:

val mapper = new ObjectMapper
val root = mapper.readTree(message)
val metadata =root.at("/message_metadata").asText()
val root1 = mapper.readTree(metadata)
val event_type =root1.at("/event_type").asText()
print("eventType:" + event_type.toString) //UpdateName

这工作正常,我得到的值为更新名称。但是当我想在一行中获取事件类型时,如下所示:

val mapper = new ObjectMapper
val root = mapper.readTree(message)
val event_type =root.at("/message_metadata/event_type").asText()
print("eventType:" + event_type.toString) //Empty string

此处事件类型返回一个空刺痛。这可能是因为message_metadata将 Json 对象作为字符串值。有没有办法在一行中获取event_type的值?

问题是您的 JSON message包含一个对象,该对象message_metadata字段本身包含 JSON,因此必须单独解码。我建议你不要把JSON放到JSON中,而只对数据结构进行一次编码。

例:

val message = "{"me":"a",
    "version":"1.0",
    "message_metadata": {
                          "event_type":"UpdateName",
                          "start_date":"1515"
    }
}"
您可以使用

案例类解析 JSON,然后从那里获取event_type字段。

case class Json(me: String, version: String, message_metadata: Message)
case class Message(event_type: String, start_date: String)
object Mapping {
  def main(args: Array[String]): Unit = {
    import com.fasterxml.jackson.databind.ObjectMapper
    import com.fasterxml.jackson.module.scala.DefaultScalaModule
    import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
    val objectMapper = new ObjectMapper() with ScalaObjectMapper
    objectMapper.registerModule(DefaultScalaModule)
    val str = "{n  "me": "a",n  "version": "1.0",n  "message_metadata": {n    "event_type": "UpdateName",n    "start_date": "1515"n  }n}"
    val json = objectMapper.readValue(str, classOf[Json])
    //to print event_type
    println(json.message_metadata.event_type)
    //output: UpdateName
  }
}
  • 您甚至可以将JSON转换为Scala案例类,然后从案例类中获取特定字段。

  • 请在此处找到我使用泛型提供的工作和详细答案。

最新更新