Conversor JSON para Apex
Cole o JSON válido abaixo e o Apex correspondente será gerado. Se uma de suas chaves JSON resultar em um Apex inválido, como palavras-chave reservadas, será gerado um analisador personalizado.
public class GeneratedApex {
public UserProfile userProfile;
public class UserProfile {
public Integer userId; // 1001
public PersonalInfo personalInfo;
public Contact contact;
public Address address;
public List<SocialMediaProfiles> socialMediaProfiles;
}
public class PersonalInfo {
public String firstName; // "Jane"
public String lastName; // "Doe"
public Integer age; // 28
}
public class Contact {
public String email; // "jane.doe@example.com"
public Phone phone;
}
public class Phone {
public String home; // "555-1234"
public String work; // "555-5678"
}
public class Address {
public String street; // "123 Main St"
public String city; // "Springfield"
public String state; // "IL"
public String postalCode; // "62701"
}
public class SocialMediaProfiles {
public String platform; // "Twitter"
public String username; // "janedoe"
}
public static GeneratedApex parse(String jsonString) {
return (GeneratedApex) JSON.deserialize(jsonString, GeneratedApex.class);
}
}
Como usar o conversor JSON para Apex
Comece colando seus dados JSON na área de texto no lado esquerdo. A ferramenta analisa o JSON e gera classes Apex correspondentes, que são exibidas na área de texto à direita. Essas classes representam a estrutura dos dados JSON, incluindo quaisquer objetos e matrizes aninhados, em um formato compatível com a linguagem de programação Apex do Salesforce. Às vezes, as propriedades da carga JSON usam palavras-chave reservadas pelo Apex. Nesse caso, um analisador personalizado será gerado, pois a desserialização direta não é possível. Em ambos os casos, basta passar uma string JSON válida para o método GeneratedApex.parse() para gerar a estrutura Apex correspondente.
Como usar o Apex gerado
Gerar Apex é uma coisa, mas saber usá-lo é outra. Vejamos dois exemplos. Começamos com o caso mais simples, onde o seguinte JSON gera uma classe Apex que pode ser desserializada diretamente:
JSON
{
"userProfile": {
"userId": 1001,
"personalInfo": {
"firstName": "Jane",
"lastName": "Doe",
"age": 28
},
"contact": {
"email": "jane.doe@example.com",
"phone": {
"home": "555-1234",
"work": "555-5678"
}
},
"address": {
"street": "123 Main St",
"city": "Springfield",
"state": "IL",
"postalCode": "62701"
},
"socialMediaProfiles": [
{
"platform": "Twitter",
"username": "janedoe"
},
{
"platform": "LinkedIn",
"url": "https://www.linkedin.com/in/janedoe/"
}
]
}
}
Apex gerado
public class GeneratedApex {
public UserProfile userProfile;
public class UserProfile {
public Integer userId; // 1001
public PersonalInfo personalInfo;
public Contact contact;
public Address address;
public List<SocialMediaProfiles> socialMediaProfiles;
}
public class PersonalInfo {
public String firstName; // "Jane"
public String lastName; // "Doe"
public Integer age; // 28
}
public class Contact {
public String email; // "jane.doe@example.com"
public Phone phone;
}
public class Phone {
public String home; // "555-1234"
public String work; // "555-5678"
}
public class Address {
public String street; // "123 Main St"
public String city; // "Springfield"
public String state; // "IL"
public String postalCode; // "62701"
}
public class SocialMediaProfiles {
public String platform; // "Twitter"
public String username; // "janedoe"
}
public static GeneratedApex parse(String jsonString) {
return (GeneratedApex) JSON.deserialize(jsonString, GeneratedApex.class);
}
}
Usar a classe gerada para desserializar a carga JSON recebida é simples, desde que a estrutura esteja configurada. Abaixo, você encontrará um exemplo completo de como chamar uma API e desserializar a resposta JSON. A desserialização requer apenas uma linha de código.
public class ApiService {
public static GeneratedApex fetchUserData() {
// Create an HTTP request and response
Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint('https://api.example.com/userdata'); // Replace with your API endpoint
request.setMethod('GET');
request.setHeader('Content-Type', 'application/json');
try {
// Send the HTTP request and get the response
HttpResponse response = http.send(request);
// Check if the request was successful
if (response.getStatusCode() == 200) {
// Deserialize the JSON response into the GeneratedApex object
GeneratedApex result = (GeneratedApex) JSON.deserialize(response.getBody(), GeneratedApex.class);
return result;
} else {
// Handle the error scenario
System.debug('Error: ' + response.getStatusCode() + ' - ' + response.getStatus());
return null;
}
} catch (Exception e) {
// Handle any exceptions that occur during the HTTP request
System.debug('Exception: ' + e.getMessage());
return null;
}
}
}
O exemplo acima é simples e não requer um analisador personalizado. No entanto, se o Apex gerado contiver um reserved keyword ou caracteres inválidos, será necessário um analisador personalizado. Esse é o tema da próxima seção.
Desserializando JSON com um analisador personalizado
JSON é uma coleção de pares chave-valor que podem ser aninhados. Se alguma dessas chaves for uma palavra-chave reservada do Apex ou contiver caracteres inválidos, como começar com um sublinhado, o Apex gerado pelo método acima não será compilado.
Nosso conversor detecta esses problemas e gera automaticamente um código Apex que inclui um analisador personalizado. Abaixo está um exemplo em que nomes de chaves JSON que teriam causado problemas no Apex foram corrigidos com os prefixos de namespace NS_ e ns.
JSON
{
"user": {
"userId": "user_456",
"email": "user@example.com",
"log-id": "abc123",
"_object": "accountActivation"
}
}
Apex gerado
public class GeneratedApex {
public NS_User nsUser;
public class NS_User {
public String userid;
public String email;
public String logid;
public String nsObject;
}
public static GeneratedApex parse(String jsonString) {
JSONParser parser = JSON.createParser(jsonString);
if (parser.nextToken() != null) {
return parseGeneratedApex(parser);
} else {
return null;
}
}
private static GeneratedApex parseGeneratedApex(JSONParser parser) {
GeneratedApex obj = new GeneratedApex();
while (parser.nextToken() != System.JSONToken.END_OBJECT) {
if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
String fieldName = parser.getText();
if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
if (fieldName == 'user') {
obj.nsUser = parseNS_User(parser);
} else {
System.debug(LoggingLevel.WARN, 'Unknown field: ' + fieldName);
consumeObject(parser);
}
}
}
}
return obj;
}
private static NS_User parseNS_User(JSONParser parser) {
NS_User obj = new NS_User();
while (parser.nextToken() != System.JSONToken.END_OBJECT) {
if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
String fieldName = parser.getText();
if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
if (fieldName == 'userId') {
obj.userid = parser.getText();
} else if (fieldName == 'email') {
obj.email = parser.getText();
} else if (fieldName == 'log-id') {
obj.logid = parser.getText();
} else if (fieldName == '_object') {
obj.nsObject = parser.getText();
} else {
System.debug(LoggingLevel.WARN, 'Unknown field: ' + fieldName);
consumeObject(parser);
}
}
}
}
return obj;
}
private static void consumeObject(JSONParser parser) {
Integer depth = 0;
do {
System.JSONToken curr = parser.getCurrentToken();
if (curr == System.JSONToken.START_OBJECT || curr == System.JSONToken.START_ARRAY) {
depth++;
} else if (curr == System.JSONToken.END_OBJECT || curr == System.JSONToken.END_ARRAY) {
depth--;
}
} while (depth > 0 && parser.nextToken() != null);
}
}
O Apex gerado tende a ser mais longo, pois há mais trabalho envolvido na tradução do JSON para Apex, mas ele é usado da mesma maneira que no exemplo acima.
public class ApiService {
// Method to fetch and parse JSON from the API
public static GeneratedApex fetchAndParseUser(String endpointUrl) {
Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint(endpointUrl);
request.setMethod('GET');
try {
HttpResponse response = http.send(request);
if (response.getStatusCode() == 200) {
String jsonResponse = response.getBody();
System.debug('API Response: ' + jsonResponse);
// Deserialize JSON using GeneratedApex class
GeneratedApex parsedData = GeneratedApex.parse(jsonResponse);
System.debug('Parsed Data: ' + parsedData);
return parsedData;
} else {
System.debug('Error: HTTP response code ' + response.getStatusCode());
return null;
}
} catch (Exception e) {
System.debug('Error in API call: ' + e.getMessage());
return null;
}
}
}
Referências
- Apex Reference Guide: JSON Class