Convertidor JSON a Apex

Pegue JSON válido a continuación y se generará el Apex correspondiente. Si alguna de sus claves JSON resultara en un Apex no válido, como palabras clave reservadas, se generará un analizador 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);
    }
}
Photo of calculator author Wes NolteCreado por Wes Nolte.Última actualización Nov 18, 2024. Referencias.

Cómo utilizar el convertidor JSON a Apex

Comience pegando sus datos JSON en el área de texto del lado izquierdo. La herramienta analiza el JSON y genera las clases de Apex correspondientes, que se muestran en el área de texto de la derecha. Estas clases representan la estructura de los datos JSON, incluidos los objetos y matrices anidados, en un formato compatible con el lenguaje de programación Apex de Salesforce. A veces, las propiedades de la carga útil JSON utilizan palabras clave reservadas por Apex. En este caso, se genera un analizador personalizado porque la deserialización directa no es posible. En cualquier caso, solo necesita pasar una cadena JSON válida al método GeneratedApex.parse() para generar la estructura de Apex correspondiente.

Cómo utilizar el Apex generado

Generar Apex es una cosa, pero saber utilizarlo es otra. Veamos dos ejemplos. Comenzamos con el caso de uso más sencillo, donde el siguiente JSON genera una clase de Apex que puede deserializarse directamente:

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 generado

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 la clase generada para deserializar la carga útil JSON entrante es sencillo una vez que tenemos la estructura en su lugar. A continuación, encontrará un ejemplo completo de cómo llamar a una API y luego deserializar la respuesta JSON. La deserialización requiere solo una línea 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;
        }
    }
}

El ejemplo anterior es sencillo y no requiere un analizador personalizado. Sin embargo, si el Apex generado contiene un reserved keyword o caracteres inválidos, se requiere un analizador personalizado. Este es el tema de la siguiente sección.

Deserializar JSON con un analizador personalizado

JSON es una colección de pares clave-valor que pueden anidarse. Si alguna de estas claves es una palabra clave reservada de Apex o contiene caracteres inválidos, como comenzar con un guion bajo, entonces el Apex generado con el método anterior no se compilará.

Nuestro convertidor detecta estos problemas y genera automáticamente un código Apex que incluye un analizador personalizado. A continuación se muestra un ejemplo en el que los nombres de clave JSON que habrían causado problemas en Apex se han sanitizado con prefijos de espacio de nombres NS_ y ns.

JSON

{
    "user": {
        "userId": "user_456",
        "email": "user@example.com",
        "log-id": "abc123",
        "_object": "accountActivation"
    }
}

Apex generado

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);
  }
}

El Apex generado tiende a ser más largo, ya que implica más trabajo en la traducción del JSON a Apex, pero se utiliza de la misma manera que en el ejemplo anterior.

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;
        }
    }
}

Referencias

  1. Apex Reference Guide: JSON Class