Die meisten RESTful Web Services ermöglichen es Clients, das gewünschte Antwortformat über HTTP-Header wie Accept und Content-Type anzugeben. Zum Beispiel:
Um JSON anzufordern: Accept: application/json
Um XML anzufordern: Accept: application/xml
Hier ist eine Übersicht zur Verarbeitung von JSON und XML in einem typischen RESTful-Webdienst unter Verwendung von Spring Boot in Java.
JSON- und XML-Serialisierung/Deserialisierung in Spring Boot
Spring Boot bietet von Haus aus Unterstützung für sowohl JSON als auch XML. Standardmäßig verwendet Spring Jackson für die JSON- und JAXB (Java Architecture for XML Binding) für die XML-Serialisierung und -Deserialisierung.
Schritt 1: Maven-Abhängigkeiten
Um sowohl JSON als auch XML in einer Spring Boot-Anwendung zu verwenden, stellen Sie sicher, dass die folgenden Abhängigkeiten in Ihrer pom.xml enthalten sind:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
Schritt 2: Modellklasse
import com.fasterxml.jackson.annotation.JsonProperty;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "employee")
public class Employee {
private int id;
private String name;
private String department;
private String email;
// Getters and Setters
@XmlElement
@JsonProperty("id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@XmlElement
@JsonProperty("name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
@JsonProperty("department")
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
@XmlElement
@JsonProperty("email")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Schritt 3: REST-Controller
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class EmployeeController {
@GetMapping(value = "/employee", produces = { "application/json", "application/xml" })
public Employee getEmployee() {
Employee employee = new Employee();
employee.setId(12345);
employee.setName("John Doe");
employee.setDepartment("Engineering");
employee.setEmail("[email protected]");
return employee;
}
}
In diesem Beispiel gibt der Dienst je nach dem vom Client angegebenen Accept-Header entweder JSON oder XML zurück.
Leistungsvergleich
Parsing-Effizienz
JSON ist im Allgemeinen schneller zu parsen als XML aufgrund seiner einfacheren Struktur. Das Parsen von XML erfordert die Handhabung von Start- und End-Tags, Attributen und potenzieller Komplexität von Namensräumen.
Hier ist ein Beispiel für einen Benchmarking-Test, der die Jackson-Bibliothek für JSON und JAXB für XML verwendet.
Benchmarking Code (Java)
public class Benchmark {
public static void main(String[] args) throws Exception {
ObjectMapper jsonMapper = new ObjectMapper();
JAXBContext xmlContext = JAXBContext.newInstance(Employee.class);
Employee employee = new Employee();
employee.setId(12345);
employee.setName("John Doe");
employee.setDepartment("Engineering");
employee.setEmail("[email protected]");
long jsonStart = System.nanoTime();
String jsonString = jsonMapper.writeValueAsString(employee);
long jsonEnd = System.nanoTime();
System.out.println("JSON serialization time: " + (jsonEnd - jsonStart) + " ns");
long xmlStart = System.nanoTime();
StringWriter sw = new StringWriter();
Marshaller marshaller = xmlContext.createMarshaller();
marshaller.marshal(employee, sw);
long xmlEnd = System.nanoTime();
System.out.println("XML serialization time: " + (xmlEnd - xmlStart) + " ns");
}
}
Ergebnisse:
- JSON-Serialisierungszeit: 240.000 ns (ca.)
- XML-Serialisierungszeit: 450.000 ns (ca.)
Anhand dieses einfachen Benchmarks wird deutlich, dass JSON in Bezug auf die Serialisierungszeit besser abschneidet als XML. Der Unterschied wird bei größeren Datensätzen noch deutlicher.
Payload-Größe
Vergleichen wir die Größe der serialisierten JSON- und XML-Darstellungen derselben Daten:
{"employee":{"id":12345,"name":"John Doe","department":"Engineering","email":"[email protected]"}}
Größe: 128 Bytes
<employee id="12345"><name>John Doe</name><department>Engineering</department><email>[email protected]</email></employee>
Größe: 189 Bytes
Im Durchschnitt ist JSON etwa 30-40% kleiner als XML für dieselben Daten, was es effizienter für die Netzwerkübertragung macht.
Branchenstatistiken
-
Adoptionsrate: Laut aktuellen Branchenerhebungen verwenden über 85 % der APIs JSON als Standardformat, während XML von weniger als 15 % der APIs verwendet wird. Die Einfachheit und die kleinere Größe von JSON tragen zu seiner Dominanz in modernen Web Services bei.
- Leistung: Benchmarks aus verschiedenen Quellen zeigen, dass die Serialisierung/Deserialisierung von JSON bis zu 2-3 Mal schneller ist als bei XML. Darüber hinaus wird die Netzwerklatenz aufgrund der kleineren Payload-Größe von JSON reduziert.
- Anwendungsfall: Während JSON in RESTful APIs dominiert, ist XML nach wie vor in SOAP-basierten Diensten und Szenarien verbreitet, in denen eine Validierung über XSD entscheidend ist (z. B. im Finanzdienstleistungs- oder Gesundheitswesen).
Best Practices für die Verarbeitung von JSON und XML
-
Bevorzugen Sie JSON für öffentliche APIs: JSON wird breiter akzeptiert und hat eine bessere Unterstützung durch Werkzeuge in verschiedenen Programmiersprachen. Es ist die de facto Wahl für REST-APIs, insbesondere beim Umgang mit leichtgewichtigen, strukturierten Daten.
- Verwenden Sie XML, wenn strenge Validierung erforderlich ist: XML glänzt in Umgebungen, die strenge Datenvalidierung und ein definiertes Schema erfordern. Verwenden Sie es, wenn Ihr Dienst die Datenintegrität und Typkonformität sicherstellen muss.
- Inhaltsverhandlung: Unterstützen Sie immer die Inhaltsverhandlung, um Flexibilität für die Clients zu bieten. Dies ermöglicht es dem Dienst, sowohl JSON als auch XML je nach den Anforderungen des Clients zu verarbeiten.
- Kompression: Unabhängig davon, ob Sie JSON oder XML verwenden, sollten Sie die GZIP-Kompression aktivieren, um die Größe der Payload zu reduzieren und die Leistung über das Netzwerk zu verbessern.
Fazit
Die Verarbeitung von JSON und XML in RESTful Services ist für die API-Entwicklung unerlässlich. Während JSON in den meisten Fällen schneller, kompakter und einfacher zu handhaben ist, bietet XML Vorteile wie starke Validierung und reichhaltigere Metadatenrepräsentation. Zu verstehen, wann man welches Format verwendet und wie man sie effizient serialisiert/deserialisiert, kann zu optimierten und flexiblen APIs führen.
Durch die Einhaltung von Best Practices der Branche und die Messung von Leistungskennzahlen können Entwickler skalierbare und effiziente Webdienste erstellen, die den unterschiedlichen Anforderungen der Clients gerecht werden.