Конвертер JSON в Apex

Вставьте действительный JSON ниже, и соответствующий Apex будет создан. Если ваш JSON содержит зарезервированные ключевые слова, будет создан пользовательский анализатор.

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 NolteСоздано Wes Nolte.Последнее обновление Nov 18, 2024. Ссылки.

Как использовать конвертер JSON в Apex

Начните с вставки ваших данных JSON в текстовое поле слева. Инструмент анализирует JSON и генерирует соответствующие классы Apex, которые отображаются в текстовом поле справа. Эти классы представляют структуру данных JSON, включая вложенные объекты и массивы, в формате, совместимом с языком программирования Apex компании Salesforce. Иногда свойства JSON используют зарезервированные ключевые слова Apex. В таком случае создается пользовательский анализатор, так как прямая десериализация невозможна. В любом случае достаточно передать метод GeneratedApex.parse() с действительной строкой JSON, чтобы сгенерировать соответствующую структуру Apex.

Как использовать сгенерированный Apex

Генерировать Apex — это одно, а использовать его — совсем другое. Рассмотрим два примера. Начнем с простого случая, когда следующий JSON генерирует класс Apex, который можно десериализовать напрямую:

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

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

Использовать сгенерированный класс для десериализации входящей JSON-нагрузки очень просто, если структура настроена. Ниже представлен полный пример вызова API и последующей десериализации ответа JSON. Для десериализации потребуется всего одна строка кода.

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

Пример выше прост и не требует пользовательского анализатора. Однако, если сгенерированный Apex содержит reserved keyword или недопустимые символы, потребуется пользовательский анализатор. Об этом пойдет речь в следующем разделе.

Десериализация JSON с пользовательским анализатором

JSON — это коллекция пар ключ-значение, которые могут быть вложенными. Если какой-либо из ключей является зарезервированным ключевым словом Apex или содержит недопустимые символы, например, начинается с подчеркивания, то Apex, сгенерированный вышеуказанным методом, не будет скомпилирован.

Наш конвертер выявляет такие проблемы и автоматически генерирует код Apex с пользовательским анализатором. Пример ниже показывает, как имена ключей JSON, которые могли бы вызвать проблемы в Apex, были исправлены с помощью префиксов пространств имен NS_ и ns.

JSON

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

Сгенерированный Apex

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

Сгенерированный Apex обычно длиннее, так как процесс преобразования JSON в Apex требует большего объема работы, но используется он аналогично примеру выше.

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

Ссылки

  1. Apex Reference Guide: JSON Class