JSON-zu-Apex-Konverter

Fügen Sie unten gültiges JSON ein und der entsprechende Apex wird generiert. Wenn einer Ihrer JSON-Schlüssel zu ungültigem Apex führt, z. B. reservierte Schlüsselwörter, wird ein benutzerdefinierter Parser generiert.

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 NolteErstellt von Wes Nolte.Zuletzt aktualisiert Nov 18, 2024. Referenzen.

So verwenden Sie den JSON-zu-Apex-Konverter

Fügen Sie zunächst Ihre JSON-Daten in den Textbereich auf der linken Seite ein. Das Tool analysiert die JSON-Daten und generiert entsprechende Apex-Klassen, die im Textbereich rechts angezeigt werden. Diese Klassen repräsentieren die Struktur der JSON-Daten, einschließlich aller verschachtelten Objekte und Arrays, in einem Format, das mit der Programmiersprache Apex von Salesforce kompatibel ist. Manchmal enthalten die JSON-Payload-Eigenschaften Schlüsselwörter, die in Apex reserviert sind. In diesem Fall wird ein benutzerdefinierter Parser generiert, da eine direkte Deserialisierung nicht möglich ist. In beiden Fällen müssen Sie einfach der Methode GeneratedApex.parse() eine gültige JSON-Zeichenkette übergeben, um die entsprechende Apex-Struktur zu generieren.

So verwenden Sie den generierten Apex

Apex zu generieren ist eine Sache, aber zu wissen, wie man es verwendet, ist eine andere. Schauen wir uns ein Beispiel an. Wir beginnen mit dem folgenden JSON und dem entsprechenden 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/"
            }
        ]
    }
}

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

Die Verwendung der generierten Klasse zum Deserialisieren der eingehenden JSON-Nutzlast ist einfach, sobald wir die Struktur eingerichtet haben. Nachfolgend finden Sie ein vollständiges Beispiel für den Aufruf einer API und die anschließende Deserialisierung der JSON-Antwort. Die Deserialisierung ist jedoch nur eine Codezeile.

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

Das obige Beispiel weist jedoch ein Problem auf. Der generierte Apex verwendet ein reserved keyword, sodass der Apex-Compiler das Speichern des generierten Apex auf dem Server ermöglicht. Wie geht man am besten mit Payloads um, die reservierte Schlüsselwörter verwenden? Das ist das Thema des nächsten Abschnitts.

Deserialisieren von JSON mit einem benutzerdefinierten Parser

JSON ist einfach eine Sammlung von Schlüssel-Wert-Paaren, die verschachtelt werden können. Wenn einer dieser Schlüssel ein in Apex reserviertes Schlüsselwort ist oder ungültige Zeichen enthält, wie beispielsweise ein führender Unterstrich, wird der Apex, der mit der oben genannten Methode generiert wurde, nicht kompiliert.

Unser Konverter erkennt solche Probleme und generiert automatisch Apex-Code, der stattdessen einen benutzerdefinierten Parser enthält. Nachfolgend finden Sie ein Beispiel, in dem JSON-Schlüsselnamen, die in Apex Probleme verursacht hätten, mit den Namespace-Präfixen NS_ und ns bereinigt wurden.

JSON

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

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

Der generierte Apex ist tendenziell länger, da mehr Arbeit in die Übersetzung des JSON in Apex investiert wird, aber Sie würden ihn genauso verwenden wie das obige Beispiel.

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

Referenzen

  1. Apex Reference Guide: JSON Class