When you need to remove sensitive data from json before logging the following method will remove a predefined list of keywords
String bodyArgs = '{"name":"test", "ssn":"324234234", "email":"test@mail.com"}';
Object bodyObj = (Object)JSON.deserializeUntyped(bodyArgs);
Map<String, Object> mapObj = new Map<String, Object>();
if (bodyObj instanceof List<Object>){
List<Object> lstObjs = (List<Object>)JSON.deserializeUntyped(bodyArgs);
for (Object lstObj : lstObjs){
Map<String,Object> parseLstObj = (Map<String,Object>)JSON.deserializeUntyped(JSON.serialize(lstObj));
mapObj.putAll(parseLstObj);
}
} else {
mapObj = (Map<String,Object>)JSON.deserializeUntyped(bodyArgs);
}
Map<String, String> newMappedValues = new Map<String, String>
System.debug(removeAttributes(mapObj, newMappedValues));
>>> Output: '{"name":"test"}'
removeAttributes method will iterate all the keys in the payload and remove the sensitive keys from the payload
private Set<String> removeSensitiveKeyValue = new Set<String>{'ssn', 'email', 'dob'};
public Map<String, String> removeAttributes(Map<String,Object> jsonObj, Map<String, String> mappedKeys) {
for(String key : jsonObj.keySet()) {
if (removeSensitiveKeyValue.contains(key)){
jsonObj.remove(key);
} else {
if(jsonObj.get(key) instanceof Map<String,Object>) {
removeAttributes((Map<String,Object>)jsonObj.get(key), mappedKeys);
} else if(jsonObj.get(key) instanceof List<Object>) {
for(Object listItem : (List<Object>)jsonObj.get(key)) {
if(listItem instanceof Map<String,Object>) {
removeAttributes((Map<String,Object>)listItem, mappedKeys);
}
}
} else {
mappedKeys.put(key, String.valueOf(jsonObj.get(key)));
}
}
}
return mappedKeys;
}