jsonscalarecursionloggingdata-masking

How to convert scala.some to scala.mutable.Map?


i am trying to write code to mask nested json fields..

 def maskRecursively(map :mutable.Map[String,Object]):mutable.Map[String,Object] ={
val maskColumns = PII_Data.getPIIData()
for((k,v) <- map){
  if(v.isInstanceOf[Map[String,Object]]){
    maskRecursively(map.get(k).asInstanceOf[mutable.Map[String,Object]])
  }else if(v.isInstanceOf[List[Object]]) {

  } else {
    if(maskColumns.contains(k)){map+=(k->"*****")}
  }

}


map }

calling this method from ..

val mapper = new ObjectMapper()
    mapper.registerModule(DefaultScalaModule)
    val result = mapper.readValue(jsonStr, classOf[ java.util.Map[String,Object] ])
    import scala.collection.JavaConverters._
    val myScalaMap = result.asScala
    maskRecursively(result.asScala)

i am getting error while trying to iterate a nested json object ..

Cannot cast value of type 'scala.Some' to type 'scala.collection.mutable.Map'

how do i recurse a complex nested json object this way ?


Solution

  • After some digging , i was able to solve this..

        def maskJson(jsonStr: String): String = {
        implicit val formats = org.json4s.DefaultFormats
        val mapper = new ObjectMapper()
        mapper.registerModule(DefaultScalaModule)
        val result = mapper.readValue(jsonStr, classOf[Map[String, Object]])
        val maskedJson = maskRecursively(result)
        mapper.writeValueAsString(maskedJson)
    
      }
    
    
      def maskRecursively(map: Map[String, Object]): collection.mutable.Map[String, Object] = {
        val mutable = collection.mutable.Map[String, Object]()
        val maskColumns = PII_Data.getJsonPIIFields()
        for ((k, v) <- map) {
          if (v.isInstanceOf[Map[String, Object]]) {
            mutable += k -> maskRecursively(v.asInstanceOf[Map[String, Object]])
          } else if (v.isInstanceOf[List[Object]]) {
            val list = v.asInstanceOf[List[Map[String, Object]]].map(i => maskRecursively(i)).toList
            mutable += k -> list
          } else {
            if (maskColumns.contains(k)) {
              mutable += (k -> "*****")
            }
            else {
              mutable += k -> v
            }
          }
        }
        mutable
      }