[JAVA] Je veux obtenir des propriétés sous forme de chaînes JSON dans Jackson!

1.Tout d'abord

Je peux facilement convertir (désérialiser) Json string-> Java object dans Jackson, mais j'ai besoin d'obtenir certaines propriétés sous forme de chaîne JSON.

Le but est d'avoir une propriété magique (appelons-la ici payload) qui peut contenir n'importe quoi, et que vous voulez la restaurer avec le type de données (FQCN) défini dans une autre propriété.

Jackson a un @ JsonValue qui traite les chaînes JSON telles qu'elles sont, mais cela n'est valable que pour la sérialisation. Malheureusement, il n'est pas applicable pour la désérialisation.

La solution de contournement consiste à implémenter votre propre JsonDeserializer et à spécifier le processus de désérialisation individuellement avec @ JsonDeserialize. Cependant, le but est "Je veux obtenir la chaîne JSON telle quelle", donc l'implémentation de JsonDeserializer est très simple.

2. Code source

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;

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

    //★ Point 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;

    //★ Point 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
}

** ★ Point 1 ** Héritez de la classe com.fasterxml.jackson.databind.JsonDeserializer et définissez votre propreJsonDeserializer. Pour le paramètre type, spécifiez le type du résultat du processus de désérialisation, c'est-à-dire «String» cette fois.

** ★ Point 2 ** Implémentez pour remplacer la méthode deserialize et renvoyer une chaîne JSON.

** ★ Point 3 ** Dans la classe Java qui mappe JSON, ajoutez l'annotation @ JsonDeserialize à la propriété pour laquelle vous souhaitez mapper la valeur telle quelle. Attribut ʻUse★ Spécifiez leJsonDeserializer` original implémenté au point 1.

Désormais, même si la propriété JSON payload est un objet, cette chaîne JSON sera stockée telle quelle dans la propriété Stringpayload. Pour atteindre cet objectif, regardez la propriété dqcn pour identifier le type de données, puis désérialisez la valeur String de la propriété payload avec le type de données souhaité.

3. Enfin

Cette fois, j'ai expliqué comment obtenir certaines propriétés sous forme de chaîne JSON en désérialisant Jackson. Jackson a une fonction appelée JsonNode qui lit Json sous forme de données arborescentes, mais je pense qu'il existe de nombreuses façons de mapper Json et Java. À ce moment-là, si vous constatez que seules certaines propriétés restent comme Json, veuillez essayer cette utilisation.

Recommended Posts

Je veux obtenir des propriétés sous forme de chaînes JSON dans Jackson!
[jackson] Je souhaite recevoir les valeurs JSON "0" et "1" sous forme de booléen
Je veux obtenir la valeur en Ruby
Je souhaite également utiliser Combine dans UIKit.
[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView
Je veux utiliser @Autowired dans Servlet
Comment assembler JSON directement dans Jackson
[Note] Je veux obtenir dans l'ordre inverse en utilisant afterLast avec JdbcTemplate
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
Je souhaite envoyer un e-mail en Java.
Je souhaite transmettre APP_HOME pour me connecter à Gradle
rsync4j --Je veux toucher rsync en Java.
Je veux être finalement même à kotlin
Je souhaite utiliser les fonctions pratiques de Clojure dans Kotlin
Je veux faire quelque chose comme "cls" en Java
Je veux intégrer n'importe quel TraceId dans le journal
Je veux aussi utiliser des coquillages à Laradock! !!
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Je veux utiliser une petite icône dans Rails
Je souhaite définir une fonction dans la console Rails
Je veux arrêter les cas de serpent avec des définitions de table
Je veux cliquer sur une broche GoogleMap dans RSpec
# 1_JAVA Je veux obtenir le numéro d'index en spécifiant un caractère dans la chaîne de caractères
Je veux trouver la somme de contrôle MD5 d'un fichier en Java et obtenir le résultat sous forme de chaîne de caractères en notation hexadécimale.
Je veux trouver un chemin relatif dans une situation où Path est utilisé
Je souhaite effectuer une factorisation prime rapide avec Ruby (ABC177E)
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Je veux créer un fichier Parquet même en Ruby
Je souhaite passer au même écran dans l'état enregistré
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
Je veux convertir des caractères ...
Je veux ajouter un appareil dans Rails, mais je ne peux pas grouper l'installation
Je veux supprimer la marge supérieure dans UITableView de Grouped (swift)
Comment afficher une liste de chaînes dans JSF sous forme de chaînes séparées par des virgules
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Je veux changer la valeur de l'attribut dans Selenium of Ruby
Je veux extraire entre des chaînes de caractères avec une expression régulière
Comment obtenir des paramètres dans Spark
Comment concaténer des chaînes avec Java
[Ruby] Je souhaite afficher uniquement le caractère impair dans la chaîne de caractères
[Rails] Je souhaite envoyer des données de différents modèles dans un formulaire
Je veux écrire une JSP dans Emacs plus facilement que la valeur par défaut.
Exemple de code pour la sérialisation et la désérialisation des énumérations Java Enum et JSON dans Jackson
Je souhaite sélectionner plusieurs éléments avec une disposition personnalisée dans la boîte de dialogue
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (édition PowerMockito)
(Limité à Java 7 ou version ultérieure) Je souhaite que vous compariez des objets dans Objects.equals
Comment obtenir la date actuelle sous forme de chaîne au format aaaaMMjj
[Ruby] Je souhaite afficher les éléments publiés par ordre de date la plus récente
Je souhaite afficher un PDF chinois (coréen) avec des rapports fins
Mon mémorandum que je veux faire ValidationMessages.properties UTF8 dans Spring Boot
Je souhaite afficher un message d'erreur lors de l'inscription dans la base de données