Loading
Entrada e saĆ­da personalizadas para mapeadores de dados do OmniStudio no OmniStudio

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

Email

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"
  }
]
 
Carregando
Salesforce Help | Article