我正在嘗試撰寫代碼來屏蔽嵌套的 json 欄位..
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 }
從 .. 呼叫此方法
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)
我在嘗試迭代嵌套的 json 物件時遇到錯誤..
無法將型別“scala.Some”的值轉換為型別“scala.collection.mutable.Map”
我如何以這種方式遞回復雜的嵌套 json 物件?
uj5u.com熱心網友回復:
你的錯誤是
if(v.isInstanceOf[Map[String,Object]]){
maskRecursively(map.get(k).asInstanceOf[mutable.Map[String,Object]])
有幾個問題:
- 您檢查是否
v是 的實體Map,然后嘗試將其強制轉換為mutable.Map. 它們在技術上是不同的型別(可變與不可變)。 - 您檢查 的型別
v,然后將強制轉換應用于map.get(k),這將是與 不同的值和型別v。地圖的get方法回傳一個選項,因此回傳錯誤訊息。 - 由于 JVM 上的型別擦除,運行時將無法分辨例如 a
Map[String, Object]和 a之間的區別Map[SomethingElse, Whatever]- 兩者看起來就像Map在運行時一樣。isInstanceOf出于這個原因,編譯器應該給你一個關于呼叫的警告。
如果您進行isInstanceOf / asInstanceOf組合,請確保每次運算元都相同。您已經有了v,因此您無需從地圖上再次查找它。并確保在兩個 instanceOf 呼叫中使用相同的型別。
通過將其更改為來解決此問題
if(v.isInstanceOf[mutable.Map[_, _]]){
maskRecursively(v.asInstanceOf[mutable.Map[String,Object]])
uj5u.com熱心網友回復:
經過一番挖掘,我能夠解決這個問題..
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
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/474430.html
上一篇:要求失敗:提供的Maven坐標必須采用“groupId:artifactId:version”的形式
下一篇:如何在Kotlin中將scala.collection.mutable.Map轉換為scala.collection.immutable.Map?
