VocĆŖ estĆ” aqui:
Entrada e saĆda personalizadas para mapeadores de dados do OmniStudio no OmniStudio
Por padrĆ£o, os Mapeadores de dados tratam de dados JSON e XML. Para lidar com outros formatos de dados, vocĆŖ pode configurar um Mapeador de dados para usar uma entrada ou saĆda personalizada que vocĆŖ implemente Ć© uma classe personalizada. Por exemplo, vocĆŖ pode definir uma Transformação do mapeador de dados que aceita dados formatados em CSV e os gera como JSON.
As opções são as seguintes:
-
Carregamento do mapeador de dados: Entrada personalizada (a saĆda Ć© sempre um objeto do Salesforce)
-
Transformação de mapeador de dados: Entrada e saĆda personalizadas
-
Extração do Data Mapper: Entrada e saĆda personalizadas
Para configurar um Mapeador de dados para usar uma entrada ou saĆda personalizada, defina seu tipo como Personalizado. Em seguida, especifique a classe que contĆ©m os mĆ©todos serializar e desserializar que realizam a operação. A tabela a seguir mostra as propriedades para uma Transformação do mapeador de dados configurada com uma entrada e saĆda personalizadas.
| Propriedade | Valor |
|---|---|
| Nome da interface do Data Mapper | Transformação de serialização personalizada |
| Tipo de interface | Transformar |
| Tipo de entrada | Personalizado |
| Classe de entrada personalizada | CSVProcessor |
| Tipo de saĆda | Personalizado |
| Classe de saĆda personalizada | CSVProcessor |
Para facilitar o mapeamento, vocĆŖ pode colar a entrada de amostra nos painĆ©is Entrada esperada e SaĆda esperada.
Para criar a lógica necessĆ”ria para entrada e saĆda personalizadas, vocĆŖ deve definir uma classe personalizada que implemente Callable. Para saĆda personalizada, implemente o mĆ©todo de serialização. Para entrada personalizada, implemente o mĆ©todo deserialize. NĆ£o Ć© possĆvel renomear os parĆ¢metros de entrada e saĆda.
O exemplo a seguir mostra a estrutura bÔsica de uma classe de serialização do cliente e desserialização.
global with sharing class PreprocessorClassExample implements Callable {
public Object call(String action, Map<String, Object> args) {
Map<String, Object> input = (Map<String, Object>)args.get('input');
Map<String, Object> output = (Map<String, Object>)args.get('output');
Map<String, Object> options = (Map<String, Object>)args.get('options');
return invokeMethod(action, input, output, options);
}
private Object invokeMethod(String methodName, Map<String,Object> input, Map<String,Object> output, Map<String,Object> options) {
if (methodName == 'serialize') {
return serialize(input, output);
}
else if (methodName == 'deserialize') {
return deserialize(input, output);
}
return false;
}
/*
Serializes Apex objects into JSON content. Return String json
*/
global Boolean serialize(Map<String, Object> input, Map<String, Object> output) {
String jsonString = '';
// code
output.put('output', jsonString); // JSON String
return true;
}
/*
Deserializes the specified JSON string into collections of primitive data types. Return Object ((Map<String, Object>))
*/
global Boolean deserialize(Map<String, Object> input, Map<String, Object> output) {
Map<String, Object> returnMap = new Map<String, Object>();
// code
output.put('output', returnMap); // ---> collections of primitive data types Map<String, Object>, List<Map<String, Object>>()
return true;
}
}
O exemplo a seguir serializa e desserializa dados CSV.
global with sharing class CSVProcessor implements Callable {
public Object call(String action, Map<String, Object> args) {
Map<String, Object> input = (Map<String, Object>)args.get('input');
Map<String, Object> output = (Map<String, Object>)args.get('output');
Map<String, Object> options = (Map<String, Object>)args.get('options');
return invokeMethod(action, input, output, options);
}
private Object invokeMethod(String methodName, Map<String,Object> input, Map<String,Object> output, Map<String,Object> options)
{
System.debug('METHOD NAME >>> ' + methodName);
if (methodName == 'deserialize')
{
return deserialize(input, output);
}
return false;
}
/*
Example Output: 'Column2,Column1\nvalue0,value1.0\nvalue0.1,value1.1';
*/
/*
Deserializes the specified JSON string into collections of primitive data types. Return Object ((Map<String, Object>))
Input: 'Column2,Column1\nvalue0,value1.0\nvalue0.1,value1.1';
Output:
[
{
"Column1Test": "value1.0",
"Column2Test": "value0"
},
{
"Column1Test": "value1.1sl",
"Column2Test": "value0.1"
}
]
*/
public class csvInput {
@AuraEnabled
public string VersionData;
}
global Boolean deserialize(Map<String, Object> input, Map<String, Object> output)
{
System.debug(input);
System.debug(input.get('input'));
System.debug(input.toString());
//csvInput s = (csvInput)JSON.deserialize((string)input.get('input'), csvInput.class);
Object data = input.get('input');
csvInput s;
if(data instanceof String) {
s = (csvInput)JSON.deserialize(String.valueOf(data), csvInput.class);
} else { // try to preserve the source formatting
s = (csvInput)JSON.deserialize(JSON.serialize(data), csvInput.class);
}
Blob decodedInputBlob = System.EncodingUtil.base64Decode(s.VersionData);
String decodedCsvString = decodedInputBlob.toString();
Object inputValue = decodedCsvString;
System.debug(inputValue);
if (inputValue != null && inputValue InstanceOf String)
{
List<String> valueSet = ((String)inputValue).split('\n');
List<Map<String, String>> csvList = new List<Map<String, String>>();
List<String> columns = new List<String>();
for (Integer i = 0; i < valueSet.size(); i++)
{
String value = valueSet[i];
if (String.isBlank(value))
{
continue;
}
if (i == 0)
{
List<String> valSet = value.split(',');
for (Integer y = 0; y < valSet.size(); y++)
{
columns.add(valSet[y]);
}
}
else
{
List<String> valSet = value.split(',');
if (columns.size() >= valSet.size())
{
Map<String, String> rows = new Map<String, String>();
for (Integer z = 0; z < valSet.size(); z++)
{
rows.put(columns[z], valSet[z]);
}
csvList.add(rows);
}
}
}
output.put('output', csvList);
//Map<String, Object> returnMap = new Map<String, Object>();
//output.put('output', returnMap);
System.debug(output);
return True;
}
return False;
}
}
Por exemplo, suponha que seu arquivo CSV tenha este conteĆŗdo:
Nome |
Telefone |
|
|---|---|---|
Mary Baker |
mbaker@example.com |
415-555-3331 |
Joe Baker |
jbaker@example.com |
415-555-3332 |
Russell Baker |
rbaker@example.com |
415-555-3333 |
A classe de exemplo CSVProcessor a converte nesta entrada JSON:
[
{
"Name": "Mary Baker",
"Email": "mbaker@example.com",
"Phone": "415-555-3331"
},
{
"Name": "Joe Baker",
"Email": "jbaker@example.com",
"Phone": "415-555-3332"
},
{
"Name": "Russell Baker",
"Email": "rbaker@example.com",
"Phone": "415-555-3333"
}
]
