对于做数据的同学来说,经常需要解析json,有时json嵌套层次很多,解析起来很麻烦,有没有方法在不知道json的嵌套格式的情况下,直接通过程序自动解析整个json,尝试了一下,功能实现了,但在大数据量的情况下可能性能有问题,毕竟每条json都要去遍历其中的每一个kv节点,仅供参考,代码:
package com.ops
import java.util
import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper}
import com.fasterxml.jackson.databind.node.{ArrayNode, JsonNodeType}
import scala.util.{Failure, Success, Try}
import scala.collection.JavaConversions._
object JsonUtil {
val mapper = new ObjectMapper()
//自动解析json 方法
def autoParseJson(jsonStr: String, resMap: util.HashMap[String, Any]): util.HashMap[String, Any] = {
Try {
val rootNode = mapper.readTree(jsonStr)
val keys = rootNode.fieldNames()
while (keys.hasNext) {
val key = keys.next()
val tmpRes = rootNode.get(key)
//如果json对象,递归继续解析
if (tmpRes.isObject) {
autoParseJson(tmpRes.toString, resMap)
}
//如果是数组,直接取出
else if (tmpRes.isArray) {
resMap.put(key, tmpRes)
}
//其他基本类型,也直接取出
else {
if (tmpRes.isTextual) resMap.put(key, tmpRes.asText())
else resMap.put(key, tmpRes)
}
}
} match {
case Success(value) => resMap
case Failure(exception) => println(exception.toString)
resMap
}
}
def main(args: Array[String]): Unit = {
val json20200530 = "{\"@timestamp\":\"2020-05-25T09:18:08.332Z\",\"@metadata\":{\"beat\":\"filebeat\",\"type\":\"doc\",\"version\":\"6.5.0\",\"topic\":\"per_log\"},\"source\":\"/data/log-service-procession/logs/per.log\",\"message\":{\"rts\":4851,\"rho\":[[\"https://www.baidu.com\",2406,2406,2406,[2]],[\"https://www.google.cn\",1597,1965,2373,[2,2,2,2]],[\"https://www.bing.com\",349,349,349,[4,2]]],\"g\":\"cef988e-9103-1560529730626\",\"l\":\"34.24742889404297,108.86383819580078\",\"u\":\"568817000061355760\",\"fpr\":441,\"ppo\":[[\"www.baidu.com\",196,196,196,[4,22],4417]],\"s\":\"1.9.7|4g|2.11.1|75|iPhone|iPhone X (GSM+CDMA)\\u003ciPhone10,3\\u003e|iOS 13.3.1|7.0.12\",\"t\":1590398287912},\"fields\":{\"log_topics\":\"perlog\",\"ip\":\"10.0.0.0\"}}"
val map = new util.HashMap[String, Any]()
autoParseJson(json20200530, map)
val keys = map.keySet()
for(key<-keys){
println((key,map.get(key)))
}
}
}
解析出来结果:
(g,cef988e-9103-1560529730626)
(ip,10.0.0.0)
(fpr,441)
(source,/data/log-service-procession/logs/per.log)
(type,doc)
(l,34.24742889404297,108.86383819580078)
(log_topics,performance_log)
(version,6.5.0)
(ppo,[[“www.baidu.com”,196,196,196,[4,22],4417]])
(rts,4851)
(@timestamp,2020-05-25T09:18:08.332Z)
(s,1.9.7|4g|2.11.1|75|iPhone|iPhone X (GSM+CDMA)<iPhone10,3>|iOS 13.3.1|7.0.12)
(t,1590398287912)
(u,568817000061355760)
(beat,filebeat)
(rho,[[“https://www.baidu.com”,2406,2406,2406,[2]],[“https://www.google.cn”,1597,1965,2373,[2,2,2,2]],[“https://www.bing.com”,349,349,349,[4,2]]])
(topic,per_log)