我有一个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的值?
答案 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提供的有效且详细的答案。