Конвертер 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);
}
}
Как использовать конвертер 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;
}
}
}
Ссылки
- Apex Reference Guide: JSON Class