Maison > Java > javaDidacticiel > Comment regrouper une carte en éléments « valeur » avec JAXB ?

Comment regrouper une carte en éléments « valeur » avec JAXB ?

Susan Sarandon
Libérer: 2024-11-13 04:25:02
original
420 Les gens l'ont consulté

How to Marshal a Map into `value` Elements with JAXB?

Marquage de la carte dans value avec JAXB

Problème

Les cartes sont généralement marshalées dans des structures XML telles que :

<map>
  <entry>
    <key>KEY</key>
    <value>VALUE</value>
  </entry>
  <entry>
    <key>KEY2</key>
    <value>VALUE2</value>
  </entry>
  ...
</map>
Copier après la connexion

Cependant, il est parfois souhaitable de générer du XML où la clé devient le nom de l'élément et la valeur devient son contenu :

<map>
  <KEY>VALUE</KEY>
  <KEY2>VALUE2</KEY2>
 ...
</map>
Copier après la connexion

Solution

Option 1 : éléments XML nommés dynamiquement

L'utilisation de noms d'attributs dynamiques n'est pas recommandée, car il viole les principes du schéma XML et du contrat d'interface.

Option 2 : Type de clé énumérée

Pour maintenir un contrat d'interface strict, utilisez un type de clé énumérée pour la carte :

public enum KeyType {
    KEY,
    KEY2;
}

@XmlJavaTypeAdapter(MapAdapter.class)
Map<KeyType, String> mapProperty;
Copier après la connexion

Option 3 : Marshaling simplifié

Pour simplifier la structure de marshaling par défaut en , utilisez un MapAdapter qui convertit la Map en un tableau de MapElements :

class MapElements {
    @XmlAttribute
    public String key;
    @XmlAttribute
    public String value;
    
    // Required by JAXB
    private MapElements() {}
    
    public MapElements(String key, String value) {
        this.key = key;
        this.value = value;
    }
}

class MapAdapter extends XmlAdapter<MapElements[], Map<String, String>> {
    @Override
    public MapElements[] marshal(Map<String, String> arg0) {
        MapElements[] mapElements = new MapElements[arg0.size()];
        int i = 0;
        for (Entry<String, String> entry : arg0.entrySet()) {
            mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());
        }
        return mapElements;
    }
    
    @Override
    public Map<String, String> unmarshal(MapElements[] arg0) {
        Map<String, String> r = new TreeMap<>();
        for (MapElements mapelement : arg0) {
            r.put(mapelement.key, mapelement.value);
        }
        return r;
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal