scala 基于jackson自动解析json

对于做数据的同学来说,经常需要解析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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值