[JAVA] Ich möchte einige Eigenschaften als JSON-Strings in Jackson erhalten!

1. Zuallererst

Ich kann Json string-> Java object in Jackson leicht konvertieren (deserialisieren), aber ich muss einige Eigenschaften als JSON-String erhalten.

Der Zweck besteht darin, eine magische Eigenschaft (hier vorübergehend als Nutzlast bezeichnet) zu haben, die alles aufnehmen kann, und sie mit dem in einer anderen Eigenschaft definierten Datentyp (FQCN) wiederherzustellen.

Jackson hat ein @ JsonValue, das JSON-Zeichenfolgen so behandelt, wie sie sind, dies gilt jedoch nur für die Serialisierung. Leider gilt es nicht für die Deserialisierung.

Die Problemumgehung besteht darin, Ihren eigenen "JsonDeserializer" zu implementieren und den Deserialisierungsprozess individuell mit "@ JsonDeserialize" anzugeben. Der Zweck ist jedoch "Ich möchte die JSON-Zeichenfolge so erhalten, wie sie ist", sodass die Implementierung von "JsonDeserializer" sehr einfach ist.

2. Quellcode

JsonRawValueDeserializer.java


package com.example.jacksondemo;

import java.io.IOException;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

//★ Punkt 1
public class JsonRawValueDeserializer extends JsonDeserializer<String> {

    //★ Punkt 2
    @Override
    public String deserialize(JsonParser parser, DeserializationContext context)
            throws IOException, JsonProcessingException {
        return parser.readValueAsTree().toString();
    }
}

MyModel.java


package com.example.jacksondemo;

import java.io.Serializable;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

public class MyModel implements Serializable {

    private static final long serialVersionUID = 1L;

    //★ Punkt 3
    // I want json raw text!
    @JsonDeserialize(using = JsonRawValueDeserializer.class)
    private String payload;
    
    // these property are auto mapped by jackson (without special operation)
    private String fqcn;
    private Integer priority;
    private String messageId;

    // constructor, setter, getter omitted
}

** ★ Punkt 1 ** Erben Sie die Klasse "com.fasterxml.jackson.databind.JsonDeserializer" und definieren Sie Ihren eigenen "JsonDeserializer". Geben Sie für den Typparameter den Typ des Ergebnisses des Deserialisierungsprozesses an, dh diesmal "String".

** ★ Punkt 2 ** Implementieren Sie diese Option, um die Methode "deserialize" zu überschreiben und eine JSON-Zeichenfolge zurückzugeben.

** ★ Punkt 3 ** Fügen Sie in der Java-Klasse, die JSON zuordnet, die Annotation @ JsonDeserialize zu der Eigenschaft hinzu, für die Sie den Wert so zuordnen möchten, wie er ist. Geben Sie den ursprünglichen "JsonDeserializer", der in Punkt 1 implementiert ist, im Attribut "using" an.

Selbst wenn die JSON-Eigenschaft payload ein Objekt ist, wird diese JSON-Zeichenfolge so gespeichert, wie sie in der Eigenschaft Stringpayload enthalten ist. Um diesen Zweck zu erreichen, überprüfen Sie die Eigenschaft dqcn, um den Datentyp zu identifizieren, und deserialisieren Sie dann den String-Wert der Eigenschaft payload mit dem gewünschten Datentyp.

3. Schließlich

Dieses Mal erklärte ich, wie man einige Eigenschaften als JSON-Zeichenketten erhält, indem man Jackson deserialisiert. Jackson hat eine Funktion namens "JsonNode", die Json als baumstrukturierte Daten liest, aber ich denke, dass es viele Möglichkeiten gibt, Json und Java zuzuordnen. Wenn Sie zu diesem Zeitpunkt feststellen, dass nur bestimmte Eigenschaften als Json übrig bleiben, versuchen Sie diese Verwendung.

Recommended Posts

Ich möchte einige Eigenschaften als JSON-Strings in Jackson erhalten!
[jackson] Ich möchte die JSON-Werte "0" und "1" als Booleschen Wert erhalten
Ich möchte den Wert in Ruby erhalten
Ich möchte Combine auch in UIKit verwenden.
[Android] Ich möchte den Listener über die Schaltfläche in ListView abrufen
Ich möchte @Autowired in Servlet verwenden
So montieren Sie JSON direkt in Jackson
[Hinweis] Ich möchte mit afterLast mit JdbcTemplate in umgekehrter Reihenfolge arbeiten
Ich möchte die IP-Adresse erhalten, wenn ich mit Java eine Verbindung zu Wi-Fi herstelle
Ich möchte eine E-Mail in Java senden.
Ich möchte APP_HOME an Logback in Gradle übergeben
rsync4j - Ich möchte rsync in Java berühren.
Ich möchte irgendwann sogar in Kotlin sein
Ich möchte die praktischen Funktionen von Clojure in Kotlin nutzen
Ich möchte so etwas wie "cls" in Java machen
Ich möchte eine TraceId in das Protokoll einbetten
Ich möchte auch in Laradock Fischschalen verwenden! !!
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
Ich möchte ein kleines Symbol in Rails verwenden
Ich möchte eine Funktion in der Rails Console definieren
Ich möchte Schlangenfälle mit Tabellendefinitionen stoppen
Ich möchte in RSpec auf einen GoogleMap-Pin klicken
# 1_JAVA Ich möchte die Indexnummer durch Angabe eines Zeichens in der Zeichenfolge erhalten
Ich möchte die MD5-Prüfsumme einer Datei in Java finden und das Ergebnis als Zeichenfolge in hexadezimaler Notation erhalten.
Ich möchte einen relativen Pfad in einer Situation finden, in der Pfad verwendet wird
Ich möchte mit Ruby (ABC177E) eine schnelle Primfaktorisierung durchführen.
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Ich möchte eine Parkettdatei auch in Ruby erstellen
Ich möchte im gespeicherten Zustand zum selben Bildschirm wechseln
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
Ich möchte Zeichen konvertieren ...
Ich möchte Geräte in Rails hinzufügen, kann die Installation jedoch nicht bündeln
Ich möchte den oberen Rand in der UITableView von Grouped entfernen (schnell)
So geben Sie eine Liste von Zeichenfolgen in JSF als durch Kommas getrennte Zeichenfolgen aus
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
Ich möchte mit einem regulären Ausdruck zwischen Zeichenketten extrahieren
So erhalten Sie Parameter in Spark
So verketten Sie Zeichenfolgen mit Java
[Ruby] Ich möchte nur das ungerade Zeichen in der Zeichenfolge ausgeben
[Rails] Ich möchte Daten verschiedener Modelle in einem Formular senden
Ich möchte JSP in Emacs einfacher als die Standardeinstellung schreiben.
Beispielcode zum Serialisieren und Deserialisieren von Java Enum-Enumerationen und JSON in Jackson
Ich möchte im Dialogfeld mehrere Elemente mit einem benutzerdefinierten Layout auswählen
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (PowerMockito Edition)
(Beschränkt auf Java 7 oder höher) Ich möchte, dass Sie Objekte in Objects.equals vergleichen
So erhalten Sie das aktuelle Datum als Zeichenfolge im Format JJJJMMTT
[Ruby] Ich möchte veröffentlichte Artikel in der Reihenfolge des neuesten Datums anzeigen
Ich möchte ein chinesisches (koreanisches) PDF mit dünnen Berichten anzeigen
Mein Memorandum, dass ich ValidationMessages.properties UTF8 in Spring Boot erstellen möchte
Ich möchte bei der Registrierung in der Datenbank eine Fehlermeldung anzeigen