当前位置: 首页 > 工具软件 > Scala JSON > 使用案例 >

Scala json4s Json解析工具类

董和泽
2023-12-01
package com.sm.utils

import java.util

import com.sm.common.utils.DateUtil
import org.apache.commons.lang3.StringUtils
import org.json4s._
import org.json4s.jackson.JsonMethods._
import org.json4s.jackson.Serialization
import org.json4s.jackson.Serialization.{read, write}

import scala.collection.mutable

/**
  * create by LiuJinHe 2021/1/24
  */
object JsonParseUtils {
  implicit val formats: Formats = Serialization.formats(ShortTypeHints(List()))

  /**
    * 检验json
    */
  def validateJson(in: String): Boolean = {
    try {
      parse(in)
      true
    } catch {
      case _: Exception => false
    }
  }

  /**
    * 将对象转换为 jsonString
    */
  def parseObjToJsonString(value: AnyRef): String = {
    implicit val formats: Formats = DefaultFormats
    write(value)
  }

  /**
    * 将 jsonString 转换为map
    */
  def parseJsonStringToObj(in: String): Object = {
    //    compact(render(in))
    parse(in, useBigDecimalForDouble = true).extract[Object]
  }

  /**
    * 将 jsonString 转换为map
    *
    */
  def readJsonStringToObj(in: String): Object = {
    read[Object](in)
  }

  /**
    * 将 jValue 转换为 jsonString
    */
  def parseJValueToJsonString(obj: JValue): String = {
    compact(render(obj))
  }

  /**
    * 将 jValue 转换为 jsonString
    */
  def prettyJValueToJsonString(obj: JValue): String = {
    pretty(render(obj))
  }

  /**
    * 将 jsonString 转换为 JValue
    */
  def parseJsonStringToJValue(in: String): JValue = {
    parse(in)
  }

  /**
    * 将 jsonString 转换为 map
    */
  def parseJsonStringToMap(json: String): mutable.Map[String, Any] = {
    parse(json, useBigDecimalForDouble = true).extract[mutable.Map[String, Any]]
  }

  /**
    * 添加或更新 jsonString 中的字段
    */
  def upsertKeyValueToJsonString(json: String, key: String, value: Any): String = {
    val map = parseJsonStringToMap(json).+((key, value))
    parseObjToJsonString(map)
  }

  /**
    * 更新 jsonString 的字段
    */
  def alterKeyValueOfJsonString(json: String, key: String, value: Any): String = {
    val map = parseJsonStringToMap(json)
    map(key) = value
    parseObjToJsonString(map)
  }

  /**
    * 移除jsonString的字段
    */
  def removeKeyOfJsonString(json: String, key: String): String = {
    val map = parseJsonStringToMap(json).-=(key)
    parseObjToJsonString(map)
  }

  /**
    * 合并两个jValue
    */
  def mergeJValue(json1: JValue, json2: JValue): String = {
    (json1 merge json2).toString
  }

  /**
    * 合并两个json
    */
  def mergeJson(json1: String, json2: String): String = {
    val map = parseJsonStringToMap(json1).++(parseJsonStringToMap(json2))
    parseObjToJsonString(map)
  }

  /**
    * 判断 jsonString 中是否包含某个 key
    */
  def containsKey(in: String, key: String): Boolean = {
    parse(in).findField(_._1.equals(key)).nonEmpty
  }

  /**
    * 解析 jsonString 中的 String 类型字段
    */
  def parseValueString(in: String, key: String): String = {
    (parse(in) \ key).extractOrElse[String]("").trim
  }

  /**
    * 解析 jsonString 中的 Int 类型字段
    */
  def parseValueInt(in: String, key: String): Int = {
    val numStr = (parse(in) \ key).extractOrElse[String]("0")
    if (numStr.nonEmpty && StringUtils.isNumeric(numStr)) numStr.toInt else 0
  }

  /**
    * 解析 jsonString 中的 Long 类型字段
    */
  def parseValueLong(in: String, key: String): Long = {
    val numStr = (parse(in) \ key).extractOrElse[String]("0")
    if (numStr.nonEmpty && StringUtils.isNumeric(numStr)) numStr.toLong else 0L
  }

  /**
    * 解析 jsonString 中的 Double 类型字段
    */
  def parseValueDouble(in: String, key: String): Double = {
    val numStr = (parse(in) \ key).extractOrElse[String]("0")
    if (numStr.nonEmpty) numStr.toDouble else 0.0
  }

  /**
    * 解析 jsonString 中的 Long 类型字段为 time
    */
  def parseValueTime(in: String, key: String): String = {
    val ts = (parse(in) \ key).extractOrElse[String]("0")
    if (StringUtils.isNumeric(ts)) {
      val timestamp = ts.toLong
      ts.length match {
        case 10 => DateUtil.timestampToTime(timestamp * 1000)
        case 13 => DateUtil.timestampToTime(timestamp)
        case _ => DateUtil.getNowTime
      }
    } else {
      ts
    }
  }

  /**
    * 解析 jsonString 中的 Long 类型字段为 date
    */
  def parseValueDate(in: String, key: String): String = {
    val ts = (parse(in) \ key).extractOrElse[String]("0")
    if (StringUtils.isNumeric(ts)) {
      val timestamp = ts.toLong
      ts.length match {
        case 10 => DateUtil.timestampToDate(timestamp * 1000)
        case 13 => DateUtil.timestampToDate(timestamp)
        case _ => DateUtil.getTodayDate
      }
    } else {
      ts
    }
  }

  /**
    * 获取 JSONObject 对应 Key 的值, 过滤特殊字符
    */
  def parseRoleName(json: String, key: String): String = {
    val roleName = parseValueString(json, key)
    if (roleName.isEmpty) "" else roleName.replace("\\\n|\\\r|\"|\'|\\\\", "")
  }

}

 

 类似资料: