使用Scala中的jackson mapper从Json字符串中提取字段

时间:2018-01-07 11:36:31

标签: scala jackson

我有一个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

这很好用,我得到的值是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的值?

3 个答案:

答案 0 :(得分:1)

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

示例:

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

答案 1 :(得分:0)

您可以使用案例类解析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

  }

}

答案 2 :(得分:0)

  • 您甚至可以将JSON转换为Scala Case Class,然后从case类中获取特定字段。

  • 请找到我使用泛型here提供的有效且详细的答案。