我有一个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案例类,然后从案例类中获取特定字段。
-
请在此处找到我使用泛型提供的工作和详细答案。