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
334 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!

source:php.cn
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