{"id":302,"date":"2024-03-21T10:04:59","date_gmt":"2024-03-21T09:04:59","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=302"},"modified":"2024-03-26T10:05:28","modified_gmt":"2024-03-26T09:05:28","slug":"json-gson-und-die-jsonadapter-annotation","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=302","title":{"rendered":"JSON, Gson und die @JsonAdapter-Annotation"},"content":{"rendered":"\n<p>In der Welt der Softwareentwicklung ist die effiziente Handhabung von Daten ein entscheidender Aspekt. Insbesondere in Anwendungen, die Daten zwischen verschiedenen Formaten konvertieren m\u00fcssen, spielt die Serialisierung eine wichtige Rolle. Gson, eine Java-Bibliothek von Google, bietet eine einfache M\u00f6glichkeit, Java-Objekte in JSON umzuwandeln und umgekehrt. Die @JsonAdapter-Annotation von Gson erm\u00f6glicht es Entwicklern, eigene Serialisierungsroutinen zu definieren und anzuwenden, um die Konvertierung nach ihren Anforderungen anzupassen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Was ist Gson?<\/h3>\n\n\n\n<p>Gson ist eine leistungsstarke Java-Bibliothek, die von Google entwickelt wurde, um die Konvertierung von Java-Objekten in JSON und umgekehrt zu erleichtern. Mit Gson k\u00f6nnen Entwickler komplexe Objektstrukturen einfach serialisieren und deserialisieren, ohne sich um die Details der JSON-Formatierung k\u00fcmmern zu m\u00fcssen. Diese Bibliothek bietet eine Reihe von Funktionen, die das Arbeiten mit JSON-Daten in Java-Anwendungen effizienter machen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Die @JsonAdapter-Annotation<\/h3>\n\n\n\n<p>Die @JsonAdapter-Annotation ist eine der fortgeschrittenen Funktionen von Gson, die es Entwicklern erm\u00f6glicht, benutzerdefinierte Serialisierungsroutinen f\u00fcr bestimmte Felder oder Typen von Java-Objekten anzugeben. Durch die Verwendung dieser Annotation k\u00f6nnen Entwickler die Standardverhalten von Gson \u00fcberschreiben und die Konvertierung von Java-Objekten in JSON und umgekehrt nach ihren eigenen Anforderungen steuern.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Warum eigene Serialisierungsroutinen verwenden?<\/h3>\n\n\n\n<p>Es gibt verschiedene Gr\u00fcnde, warum Entwickler eigene Serialisierungsroutinen mit Gson implementieren m\u00f6chten:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Spezielle Datenformate:<\/strong> Manchmal m\u00fcssen Java-Objekte in spezielle JSON-Formate konvertiert werden, die nicht den Standardkonventionen entsprechen. In solchen F\u00e4llen erm\u00f6glichen eigene Serialisierungsroutinen die genaue Steuerung der Ausgabe.<\/li>\n\n\n\n<li><strong>Komplexes Mapping:<\/strong> Wenn die Struktur der Java-Objekte nicht direkt auf die JSON-Struktur abgebildet werden kann, erfordert dies oft eine ma\u00dfgeschneiderte Serialisierungsroutine.<\/li>\n\n\n\n<li><strong>Performance-Optimierung:<\/strong> Durch die Implementierung eigener Serialisierungsroutinen k\u00f6nnen Entwickler die Leistung ihrer Anwendung verbessern, indem sie unn\u00f6tige Verarbeitungsschritte eliminieren oder spezielle Optimierungen vornehmen.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Beispiel: Benutzerdefinierte Serialisierung mit @JsonAdapter<\/h3>\n\n\n\n<p>Um die Verwendung von eigenen Serialisierungsroutinen mit Gson zu veranschaulichen, betrachten wir ein einfaches Beispiel. Angenommen, wir haben eine Klasse <code>Person<\/code>, die ein Geburtsdatum im Format <code>LocalDate<\/code> enth\u00e4lt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import java.time.LocalDate;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Person<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> String name;\n    <span class=\"hljs-keyword\">private<\/span> LocalDate birthDate;\n\n    <span class=\"hljs-comment\">\/\/ Konstruktor, Getter und Setter<\/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\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Standardm\u00e4\u00dfig w\u00fcrde Gson das <code>LocalDate<\/code>-Objekt als JSON-String im ISO-Format serialisieren. Aber was ist, wenn wir das Geburtsdatum im Format &#8222;dd.MM.yyyy&#8220; haben m\u00f6chten?<\/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\"><span class=\"hljs-keyword\">import<\/span> com.google.gson.annotations.JsonAdapter;\n<span class=\"hljs-keyword\">import<\/span> java.time.LocalDate;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Person<\/span> <\/span>{\n    private <span class=\"hljs-built_in\">String<\/span> name;\n\n    @JsonAdapter(LocalDateAdapter.class)\n    private LocalDate birthDate;\n\n    <span class=\"hljs-comment\">\/\/ Konstruktor, Getter und Setter<\/span>\n}<\/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>Hier haben wir die @JsonAdapter-Annotation verwendet, um Gson mitzuteilen, dass es die Serialisierung des <code>birthDate<\/code>-Felds mithilfe einer benutzerdefinierten Klasse <code>LocalDateAdapter<\/code> durchf\u00fchren soll.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Implementierung der benutzerdefinierten Serialisierungsroutine<\/h3>\n\n\n\n<p>Die benutzerdefinierte Serialisierungsroutine <code>LocalDateAdapter<\/code> sollte das Interface <code>JsonSerializer&lt;T&gt;<\/code> implementieren, das von Gson bereitgestellt wird. Hier ist eine m\u00f6gliche Implementierung:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> com.google.gson.JsonElement;\n<span class=\"hljs-keyword\">import<\/span> com.google.gson.JsonSerializationContext;\n<span class=\"hljs-keyword\">import<\/span> com.google.gson.JsonSerializer;\n<span class=\"hljs-keyword\">import<\/span> java.lang.reflect.Type;\n<span class=\"hljs-keyword\">import<\/span> java.time.LocalDate;\n<span class=\"hljs-keyword\">import<\/span> java.time.format.DateTimeFormatter;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">LocalDateAdapter<\/span> <span class=\"hljs-title\">implements<\/span> <span class=\"hljs-title\">JsonSerializer<\/span>&lt;<span class=\"hljs-title\">LocalDate<\/span>&gt; <\/span>{\n    private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(<span class=\"hljs-string\">\"dd.MM.yyyy\"<\/span>);\n\n    @Override\n    public JsonElement serialize(LocalDate date, Type typeOfSrc, JsonSerializationContext context) {\n        <span class=\"hljs-keyword\">return<\/span> context.serialize(formatter.format(date));\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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 dieser Implementierung wird das <code>LocalDate<\/code>-Objekt in einen JSON-String im gew\u00fcnschten Format konvertiert.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verwendung der benutzerdefinierten Serialisierungsroutine<\/h3>\n\n\n\n<p>Nun, wenn wir eine Instanz der <code>Person<\/code>-Klasse serialisieren, wird das Geburtsdatum entsprechend unserem benutzerdefinierten Format konvertiert:<\/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-keyword\">import<\/span> com.google.gson.Gson;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Main<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        Gson gson = <span class=\"hljs-keyword\">new<\/span> Gson();\n        Person person = <span class=\"hljs-keyword\">new<\/span> Person(<span class=\"hljs-string\">\"Max Mustermann\"<\/span>, LocalDate.of(<span class=\"hljs-number\">1990<\/span>, <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">15<\/span>));\n        <span class=\"hljs-built_in\">String<\/span> json = gson.toJson(person);\n        System.out.println(json);\n    }\n}<\/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>Die Ausgabe wird das Geburtsdatum im gew\u00fcnschten Format enthalten: <code>\"birthDate\": \"15.05.1990\"<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>Die Nutzung eigener Serialisierungsroutinen mit Gson und der @JsonAdapter-Annotation bietet Entwicklern eine flexible M\u00f6glichkeit, die Konvertierung von Java-Objekten in JSON und umgekehrt zu steuern. Durch die Implementierung benutzerdefinierter Serialisierungsroutinen k\u00f6nnen spezielle Anforderungen erf\u00fcllt, komplexe Datenstrukturen abgebildet und die Leistung der Anwendung verbessert werden. Es ist jedoch wichtig, die Verwendung dieser Funktion mit Bedacht zu w\u00e4hlen und sicherzustellen, dass sie tats\u00e4chlich erforderlich ist, da sie zus\u00e4tzliche Komplexit\u00e4t in den Code einf\u00fchren kann.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In der Welt der Softwareentwicklung ist die effiziente Handhabung von Daten ein entscheidender Aspekt. Insbesondere in Anwendungen, die Daten zwischen verschiedenen Formaten konvertieren m\u00fcssen, spielt die Serialisierung eine wichtige Rolle. Gson, eine Java-Bibliothek von Google, bietet eine einfache M\u00f6glichkeit, Java-Objekte in JSON umzuwandeln und umgekehrt. Die @JsonAdapter-Annotation von Gson erm\u00f6glicht es Entwicklern, eigene Serialisierungsroutinen zu [&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-302","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\/302","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=302"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/302\/revisions"}],"predecessor-version":[{"id":303,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/302\/revisions\/303"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}