{"id":164,"date":"2024-01-12T23:58:04","date_gmt":"2024-01-12T22:58:04","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=164"},"modified":"2024-01-24T00:17:28","modified_gmt":"2024-01-23T23:17:28","slug":"benutzerdefinierte-serialisierung-und-deserialisierung-mit-jackson-jsonserialize-und-jsondeserialize","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=164","title":{"rendered":"Benutzerdefinierte Serialisierung und Deserialisierung mit Jackson: @JsonSerialize und @JsonDeserialize"},"content":{"rendered":"\n<p>Die Jackson-Bibliothek ist ein leistungsstarkes Werkzeug zur Verarbeitung von JSON-Daten in Java. Eine besonders n\u00fctzliche Funktion sind die Annotationen <code>@JsonSerialize<\/code> und <code>@JsonDeserialize<\/code>, mit denen Entwickler benutzerdefinierte Serialisierer und Deserialisierer f\u00fcr die Konvertierung von Java-Objekten in JSON und umgekehrt erstellen k\u00f6nnen. In diesem Artikel werden wir diese Annotationen anhand eines praxisnahen Beispiels demonstrieren: der benutzerdefinierten Verarbeitung von Geldbetr\u00e4gen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Money-Objekt mit W\u00e4hrung und Betrag<\/h2>\n\n\n\n<p>Angenommen, wir haben ein Java-Objekt namens <code>Money<\/code>, das einen Geldbetrag mit einer zugeh\u00f6rigen W\u00e4hrung repr\u00e4sentiert. Hier ist die Definition des Objekts:<\/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.math.BigDecimal;\nimport java.util.Currency;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Money<\/span> <\/span>{\n\n    <span class=\"hljs-keyword\">private<\/span> Currency currency;\n    <span class=\"hljs-keyword\">private<\/span> BigDecimal amount;\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>Unser Ziel ist es, die Konvertierung dieses Money-Objekts nach JSON und zur\u00fcck zu steuern, indem wir benutzerdefinierte Serialisierer und Deserialisierer implementieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Benutzerdefinierter Serialisierer f\u00fcr Money<\/h2>\n\n\n\n<p>Um einen benutzerdefinierten Serialisierer f\u00fcr das Money-Objekt zu erstellen, implementieren wir die <code>JsonSerializer&lt;T&gt;<\/code>-Schnittstelle. In diesem Beispiel konzentrieren wir uns darauf, den Geldbetrag als String mit zwei Dezimalstellen zu serialisieren:<\/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.fasterxml.jackson.core.JsonGenerator;\n<span class=\"hljs-keyword\">import<\/span> com.fasterxml.jackson.databind.JsonSerializer;\n<span class=\"hljs-keyword\">import<\/span> com.fasterxml.jackson.databind.SerializerProvider;\n\n<span class=\"hljs-keyword\">import<\/span> java.io.IOException;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MoneySerializer<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">JsonSerializer<\/span>&lt;<span class=\"hljs-title\">Money<\/span>&gt; <\/span>{\n\n    @Override\n    public <span class=\"hljs-keyword\">void<\/span> serialize(Money money, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)\n            throws IOException {\n        <span class=\"hljs-comment\">\/\/ Benutzerdefinierte Serialisierungslogik: Geldbetrag als String mit zwei Dezimalstellen<\/span>\n        <span class=\"hljs-built_in\">String<\/span> formattedAmount = <span class=\"hljs-built_in\">String<\/span>.format(<span class=\"hljs-string\">\"%.2f %s\"<\/span>, money.getAmount(), money.getCurrency().getCurrencyCode());\n        jsonGenerator.writeString(formattedAmount);\n    }\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 wird der Geldbetrag als String mit zwei Dezimalstellen und der zugeh\u00f6rigen W\u00e4hrung als W\u00e4hrungscode serialisiert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Benutzerdefinierter Deserialisierer f\u00fcr Money<\/h2>\n\n\n\n<p>Um einen benutzerdefinierten Deserialisierer zu erstellen, implementieren wir die <code>JsonDeserializer&lt;T&gt;<\/code>-Schnittstelle. Im Falle des Money-Objekts erwarten wir, dass der JSON-String in einen Geldbetrag und eine W\u00e4hrung aufgeteilt wird:<\/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.fasterxml.jackson.core.JsonParser;\n<span class=\"hljs-keyword\">import<\/span> com.fasterxml.jackson.databind.DeserializationContext;\n<span class=\"hljs-keyword\">import<\/span> com.fasterxml.jackson.databind.JsonDeserializer;\n\n<span class=\"hljs-keyword\">import<\/span> java.io.IOException;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MoneyDeserializer<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">JsonDeserializer<\/span>&lt;<span class=\"hljs-title\">Money<\/span>&gt; <\/span>{\n\n    @Override\n    public Money deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)\n            throws IOException {\n        <span class=\"hljs-comment\">\/\/ Benutzerdefinierte Deserialisierungslogik: JSON-String in Geldbetrag und W\u00e4hrung aufteilen<\/span>\n        <span class=\"hljs-built_in\">String<\/span>&#91;] parts = jsonParser.getText().split(<span class=\"hljs-string\">\" \"<\/span>);\n        BigDecimal amount = <span class=\"hljs-keyword\">new<\/span> BigDecimal(parts&#91;<span class=\"hljs-number\">0<\/span>]);\n        Currency currency = Currency.getInstance(parts&#91;<span class=\"hljs-number\">1<\/span>]);\n\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Money(currency, amount);\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>Hier wird der JSON-String aufgeteilt, um den Geldbetrag und die W\u00e4hrung zu extrahieren und ein neues Money-Objekt zu erstellen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Money-Objekt mit Annotationen verwenden<\/h2>\n\n\n\n<p>Nun k\u00f6nnen wir die erstellten Serialisierer und Deserialisierer in unserem Money-Objekt verwenden:<\/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.fasterxml.jackson.databind.annotation.JsonDeserialize;\n<span class=\"hljs-keyword\">import<\/span> com.fasterxml.jackson.databind.annotation.JsonSerialize;\n\n@JsonSerialize(using = MoneySerializer.class)\n@JsonDeserialize(using = MoneyDeserializer.class)\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Money<\/span> <\/span>{\n\n    private Currency currency;\n    private BigDecimal amount;\n\n    <span class=\"hljs-comment\">\/\/ Konstruktor, Getter und Setter<\/span>\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>Durch das Hinzuf\u00fcgen der <code>@JsonSerialize<\/code>&#8211; und <code>@JsonDeserialize<\/code>-Annotationen weisen wir Jackson an, unsere benutzerdefinierten Serialisierer und Deserialisierer zu verwenden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Praktisches Beispiel<\/h2>\n\n\n\n<p>Hier ist, wie Sie das Money-Objekt in Ihrer Anwendung verwenden k\u00f6nnen:<\/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\"><span class=\"hljs-keyword\">import<\/span> com.fasterxml.jackson.databind.ObjectMapper;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Main<\/span> <\/span>{\n\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) throws Exception {\n        <span class=\"hljs-comment\">\/\/ Erstellen eines Money-Objekts<\/span>\n        Money money = <span class=\"hljs-keyword\">new<\/span> Money(Currency.getInstance(<span class=\"hljs-string\">\"USD\"<\/span>), <span class=\"hljs-keyword\">new<\/span> BigDecimal(<span class=\"hljs-string\">\"123.45\"<\/span>));\n\n        <span class=\"hljs-comment\">\/\/ Jackson-ObjectMapper zum Konvertieren zwischen Java-Objekt und JSON verwenden<\/span>\n        ObjectMapper objectMapper = <span class=\"hljs-keyword\">new<\/span> ObjectMapper();\n\n        <span class=\"hljs-comment\">\/\/ Java-Objekt in JSON konvertieren (Serialisierung)<\/span>\n        <span class=\"hljs-built_in\">String<\/span> jsonString = objectMapper.writeValueAsString(money);\n        System.out.println(<span class=\"hljs-string\">\"Serialized JSON: \"<\/span> + jsonString);\n\n        <span class=\"hljs-comment\">\/\/ JSON in Java-Objekt konvertieren (Deserialisierung)<\/span>\n        Money deserializedMoney = objectMapper.readValue(jsonString, Money.class);\n        System.out.println(<span class=\"hljs-string\">\"Deserialized Money: \"<\/span> + deserializedMoney.getAmount() + <span class=\"hljs-string\">\" \"<\/span> + deserializedMoney.getCurrency().getCurrencyCode());\n    }\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>In diesem Beispiel demonstriert das Money-Objekt mit benutzerdefinierten Serialisierern und Deserialisierern, wie die Standardkonvertierung von Java-Objekten in JSON und umgekehrt angepasst werden kann.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Die <code>@JsonSerialize<\/code>&#8211; und <code>@JsonDeserialize<\/code>-Annotationen von Jackson erm\u00f6glichen es Entwicklern, die JSON-Konvertierung von Java-Objekten nach ihren Bed\u00fcrfnissen anzupassen. Durch die Implementierung benutzerdefinierter Serialisierer und Deserialisierer kann die Verarbeitung komplexer Objekte, wie im Beispiel des Money-Objekts gezeigt, pr\u00e4zise gesteuert werden. Dies bietet eine flexible und m\u00e4chtige L\u00f6sung f\u00fcr die Integration von JSON-Daten in Java-Anwendungen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Jackson-Bibliothek ist ein leistungsstarkes Werkzeug zur Verarbeitung von JSON-Daten in Java. Eine besonders n\u00fctzliche Funktion sind die Annotationen @JsonSerialize und @JsonDeserialize, mit denen Entwickler benutzerdefinierte Serialisierer und Deserialisierer f\u00fcr die Konvertierung von Java-Objekten in JSON und umgekehrt erstellen k\u00f6nnen. In diesem Artikel werden wir diese Annotationen anhand eines praxisnahen Beispiels demonstrieren: der benutzerdefinierten Verarbeitung [&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-164","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\/164","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=164"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/164\/revisions"}],"predecessor-version":[{"id":165,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/164\/revisions\/165"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=164"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=164"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=164"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}