Una Mappa è una raccolta di coppie Chiave-Valore in cui ad ogni chiave univoca si associa un singolo valore. Chiavi e valori possono essere qualsiasi tipo di dati: tipi primitivi, raccolte, oggetti sObject, tipi definiti dall'utente e tipi Apex innati.
Esempio:
questa tabella rappresenta una mappa di paesi e valute:
Country (Key) | Japan | France | England | Italy |
Currency (Value) | Yen | Euro | Pound | Euro |
Un record SObject ha una struttura molto simile ad una mappa per impostazione predefinita.
Account record = [SELECT Name, Phone FROM Account LIMIT 1];
system.debug(record.get('Name'));
system.debug(record.get('Phone'));
Execution Log:
USER_DEBUG [5]|DEBUG|Mario Rossi
USER_DEBUG [6]|DEBUG|null
Supporta anche put:
record.put('Phone', '0811234567');
Tuttavia, se per qualche motivo è necessario disporre di una mappa, è possibile utilizzare la serializzazione (processo intensivo per la CPU) come segue:
String stringAcc = JSON.serialize(record);
Map<String, Object> mapAcc = (Map<String, Object>)JSON.deserializeUntyped(stringAcc);
mapAcc.remove('attributes');
Codice Apex completo, per query con più record:
List<Account> record = [SELECT Name, Phone FROM Account LIMIT 2];
List<Map<String, Object>> listTotal = new List<Map<String, Object>>();
for(Account forAcc : record)
{
system.debug(forAcc.get('Name'));
system.debug(forAcc.get('Phone'));
forAcc.put('Phone', '0811234567');
String stringAcc = JSON.serialize(forAcc);
system.debug(stringAcc);
Map<String, Object> mapAcc = (Map<String, Object>)JSON.deserializeUntyped(stringAcc);
mapAcc.remove('attributes');
system.debug(mapAcc);
listTotal.add(mapAcc);
}
system.debug(listTotal);
Execution Log:
USER_DEBUG|[5]|DEBUG|Mario Rossi
USER_DEBUG|[6]|DEBUG|null
USER_DEBUG|[9]|DEBUG|{"attributes":{"type":"Account","url":"/services/data/v45.0/sobjects/Account/0011w000004rocHAAQ"},"Name":"Mario Rossi","Id":"0011w000004rocHAAQ","RecordTypeId":"0121w0000004OmvAAE","Phone":"0811234567"}
USER_DEBUG|[12]|DEBUG|{Id=0011w000004rocHAAQ, Name=Mario Rossi, Phone=0811234567, RecordTypeId=0121w0000004OmvAAE}
USER_DEBUG|[5]|DEBUG|Luca Verdi
USER_DEBUG|[6]|DEBUG|null
USER_DEBUG|[9]|DEBUG|{"attributes":{"type":"Account","url":"/services/data/v45.0/sobjects/Account/0011w000004ronHAAQ"},"Name":"Luca Verdi","Id":"0011w000004ronHAAQ","RecordTypeId":"0121w0000004OmvAAE","Phone":"0811234567"}
USER_DEBUG|[12]|DEBUG|{Id=0011w000004ronHAAQ, Name=Luca Verdi, Phone=0811234567, RecordTypeId=0121w0000004OmvAAE}
USER_DEBUG|[15]|DEBUG|({Id=0011w000004rocHAAQ, Name=Mario Rossi, Phone=0811234567, RecordTypeId=0121w0000004OmvAAE}, {Id=0011w000004ronHAAQ, Name=Luca Verdi, Phone=0811234567, RecordTypeId=0121w0000004OmvAAE})
Di seguito, un generico codice Apex per selezionare tutti i campi di un SObject ed inserirli in una mappa:
SObjectType sobType = Account.SObjectType;
List<Map<String, Object>> listTotal = new List<Map<String, Object>>();
List<String> fields = new List<String>(sobType.getDescribe().fields.getMap().keySet());
for(SObject sob : Database.query(
' select ' + String.join(fields, ',')
+ ' from ' + sobType
+ ' limit 2'))
{
Map<String,String> mapObj = new Map<String,String>();
for (String field : fields)
{
Object value = sob.get(field);
if(value != null){
mapObj.put(field, String.valueOf(value));
}
}
listTotal.add(mapObj);
}
System.debug(JSON.serialize(listTotal));