{"id":174,"date":"2024-01-17T00:32:14","date_gmt":"2024-01-16T23:32:14","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=174"},"modified":"2024-01-24T00:33:17","modified_gmt":"2024-01-23T23:33:17","slug":"vererbungshierarchien-bei-der-de-serialisierung-von-json-daten-mit-jackson","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=174","title":{"rendered":"Vererbungshierarchien bei der (De-)Serialisierung von JSON-Daten mit Jackson"},"content":{"rendered":"\n<p>Die Verarbeitung von JSON-Daten ist in der heutigen Softwareentwicklung von entscheidender Bedeutung, da JSON (JavaScript Object Notation) als ein weit verbreitetes Datenformat f\u00fcr den Austausch von Informationen zwischen verschiedenen Systemen dient. Jackson, eine Java-Bibliothek, hat sich als eine leistungsstarke und flexible L\u00f6sung f\u00fcr die Serialisierung und Deserialisierung von JSON-Daten etabliert. Dieser Artikel wirft einen detaillierten Blick auf Vererbungshierarchien im Kontext von Jackson und zeigt, wie diese erfolgreich gehandhabt werden k\u00f6nnen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Einf\u00fchrung in Jackson<\/h2>\n\n\n\n<p>Jackson ist eine High-Performance-Bibliothek f\u00fcr die Verarbeitung von JSON-Daten in Java. Sie bietet eine breite Palette von Funktionen, darunter die Umwandlung von Java-Objekten in JSON und umgekehrt. Die Bibliothek ist besonders flexibel und unterst\u00fctzt verschiedene JSON-Features, wie zum Beispiel das Arbeiten mit Vererbungshierarchien.<\/p>\n\n\n\n<p>Die Serialisierung ist der Prozess, bei dem ein Objekt in das JSON-Format umgewandelt wird, w\u00e4hrend die Deserialisierung den umgekehrten Prozess darstellt \u2013 das Lesen von JSON-Daten und die Konvertierung in Java-Objekte. Bei der Arbeit mit Vererbungshierarchien m\u00fcssen Entwickler sicherstellen, dass die Hierarchie korrekt abgebildet wird, um alle spezifischen Eigenschaften der Subklassen zu ber\u00fccksichtigen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Grundlagen der Vererbungshierarchien<\/h2>\n\n\n\n<p>In der objektorientierten Programmierung ist Vererbung ein Konzept, bei dem eine Klasse Eigenschaften und Verhalten von einer anderen Klasse erbt. Dies f\u00fchrt zu einer Hierarchie von Klassen, wobei die abgeleiteten Klassen (Subklassen) spezifischere Eigenschaften oder Methoden hinzuf\u00fcgen k\u00f6nnen.<\/p>\n\n\n\n<p>Im Kontext von JSON-Daten und Jackson bedeutet dies, dass bei der Serialisierung und Deserialisierung von Objekten mit Vererbungshierarchien die Struktur der JSON-Daten die Hierarchie der Java-Klassen genau widerspiegeln muss.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">@JsonTypeInfo Annotation<\/h2>\n\n\n\n<p>Eine Schl\u00fcsselkomponente in Jackson f\u00fcr die Behandlung von Vererbungshierarchien ist die <code>@JsonTypeInfo<\/code>-Annotation. Diese Annotation erm\u00f6glicht die Hinzuf\u00fcgung von Typinformationen zu den generierten JSON-Daten. Es gibt verschiedene Konfigurationsoptionen f\u00fcr <code>@JsonTypeInfo<\/code>, die auf unterschiedliche Anforderungen zugeschnitten sind.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verwendung der @JsonTypeInfo Annotation<\/h3>\n\n\n\n<p>Angenommen, wir haben eine Vererbungshierarchie mit den Klassen <code>Fahrzeug<\/code>, <code>Auto<\/code> und <code>Motorrad<\/code>, wobei <code>Auto<\/code> und <code>Motorrad<\/code> Subklassen von <code>Fahrzeug<\/code> sind. Um sicherzustellen, dass Jackson die Hierarchie richtig versteht, verwenden wir die <code>@JsonTypeInfo<\/code>-Annotation:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = <span class=\"hljs-string\">\"@class\"<\/span>)\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Fahrzeug<\/span> <\/span>{\n    <span class=\"hljs-comment\">\/\/ Eigenschaften und Methoden der Fahrzeugklasse<\/span>\n}\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Auto<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Fahrzeug<\/span> <\/span>{\n    <span class=\"hljs-comment\">\/\/ Eigenschaften und Methoden der Autoklasse<\/span>\n}\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Motorrad<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Fahrzeug<\/span> <\/span>{\n    <span class=\"hljs-comment\">\/\/ Eigenschaften und Methoden der Motorradklasse<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel legen wir fest, dass die Typinformationen als Klassenname hinzugef\u00fcgt werden sollen und das JSON-Attribut f\u00fcr die Typinformationen &#8222;@class&#8220; lautet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Serialisierung von Vererbungshierarchien<\/h2>\n\n\n\n<p>Bei der Serialisierung von Vererbungshierarchien ist es wichtig, dass Jackson die richtigen Typinformationen in das generierte JSON einf\u00fcgt. Durch die Verwendung der <code>@JsonTypeInfo<\/code>-Annotation k\u00f6nnen wir sicherstellen, dass die Hierarchie korrekt abgebildet wird. Hier ist ein Beispiel f\u00fcr die Serialisierung:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ObjectMapper objectMapper = <span class=\"hljs-keyword\">new<\/span> ObjectMapper();\nFahrzeug auto = <span class=\"hljs-keyword\">new<\/span> Auto();\n<span class=\"hljs-built_in\">String<\/span> json = objectMapper.writeValueAsString(auto);\nSystem.out.println(json);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Das generierte JSON k\u00f6nnte dann folgenderma\u00dfen aussehen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JSON \/ JSON mit Kommentaren\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"@class\"<\/span>: <span class=\"hljs-string\">\"com.example.Auto\"<\/span>,\n  <span class=\"hljs-comment\">\/\/ Weitere Eigenschaften des Auto-Objekts<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON mit Kommentaren<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Durch die Typinformationen in Form von <code>@class<\/code> kann Jackson beim Deserialisieren erkennen, zu welcher Klasse das JSON-Objekt geh\u00f6rt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deserialisierung von Vererbungshierarchien<\/h2>\n\n\n\n<p>Die Deserialisierung von Vererbungshierarchien erfordert, dass Jackson die richtigen Unterobjekte erstellt und initialisiert. Hier ist ein Beispiel f\u00fcr die Deserialisierung:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">String<\/span> json = <span class=\"hljs-string\">\"{\\\"@class\\\":\\\"com.example.Auto\\\"}\"<\/span>;\nObjectMapper objectMapper = <span class=\"hljs-keyword\">new<\/span> ObjectMapper();\nFahrzeug fahrzeug = objectMapper.readValue(json, Fahrzeug.class);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel liest Jackson das JSON-Objekt und erstellt eine Instanz der Klasse <code>Auto<\/code>, da die Typinformationen auf diese Klasse hinweisen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">JsonSubTypes Annotation<\/h2>\n\n\n\n<p>Zus\u00e4tzlich zur <code>@JsonTypeInfo<\/code>-Annotation kann die <code>@JsonSubTypes<\/code>-Annotation verwendet werden, um explizit Subtypen zu deklarieren. Dies kann hilfreich sein, wenn die Subklassen nicht in der Hierarchie aufgef\u00fchrt sind.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = <span class=\"hljs-string\">\"type\"<\/span>)\n@JsonSubTypes({\n    @Type(value = Auto.class, name = <span class=\"hljs-string\">\"auto\"<\/span>),\n    @Type(value = Motorrad.class, name = <span class=\"hljs-string\">\"motorrad\"<\/span>)\n})\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Fahrzeug<\/span> <\/span>{\n    <span class=\"hljs-comment\">\/\/ Eigenschaften und Methoden der Fahrzeugklasse<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Durch die Kombination von <code>@JsonTypeInfo<\/code> und <code>@JsonSubTypes<\/code> kann die Serialisierung und Deserialisierung von komplexen Vererbungshierarchien optimiert werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Die Handhabung von Vererbungshierarchien bei der Serialisierung und Deserialisierung von JSON-Daten mit Jackson erfordert sorgf\u00e4ltige Planung und Konfiguration. Die Verwendung der <code>@JsonTypeInfo<\/code>&#8211; und <code>@JsonSubTypes<\/code>-Annotationen bietet eine leistungsstarke M\u00f6glichkeit, die Hierarchie von Java-Klassen genau im JSON-Format abzubilden. Entwickler sollten die verschiedenen Konfigurationsoptionen von Jackson sorgf\u00e4ltig abw\u00e4gen, um sicherzustellen, dass die Typinformationen korrekt eingef\u00fcgt und interpretiert werden. Mit den richtigen Annotationen und Konfigurationen erm\u00f6glicht Jackson eine nahtlose Integration von Vererbungshierarchien in JSON-Daten, was f\u00fcr die Entwicklung von flexiblen und skalierbaren Anwendungen von entscheidender Bedeutung ist.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Verarbeitung von JSON-Daten ist in der heutigen Softwareentwicklung von entscheidender Bedeutung, da JSON (JavaScript Object Notation) als ein weit verbreitetes Datenformat f\u00fcr den Austausch von Informationen zwischen verschiedenen Systemen dient. Jackson, eine Java-Bibliothek, hat sich als eine leistungsstarke und flexible L\u00f6sung f\u00fcr die Serialisierung und Deserialisierung von JSON-Daten etabliert. Dieser Artikel wirft einen detaillierten [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-174","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/174","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=174"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/174\/revisions"}],"predecessor-version":[{"id":175,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/174\/revisions\/175"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}