Rumah >Java >javaTutorial >Bagaimana untuk Memastikan Peta menjadi Elemen `nilai` dengan JAXB?

Bagaimana untuk Memastikan Peta menjadi Elemen `nilai` dengan JAXB?

Susan Sarandon
Susan Sarandonasal
2024-11-13 04:25:02339semak imbas

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

Marshalling Peta ke dalam value dengan JAXB

Masalah

Peta biasanya disusun menjadi struktur XML seperti:

<map>
  <entry>
    <key>KEY</key>
    <value>VALUE</value>
  </entry>
  <entry>
    <key>KEY2</key>
    <value>VALUE2</value>
  </entry>
  ...
</map>

Walau bagaimanapun, kadangkala adalah wajar untuk menjana XML di mana kunci menjadi nama elemen dan nilai menjadi miliknya kandungan:

<map>
  <KEY>VALUE</KEY>
  <KEY2>VALUE2</KEY2>
 ...
</map>

Penyelesaian

Pilihan 1: Elemen XML Dinamakan Secara Dinamik

Menggunakan nama atribut dinamik tidak disyorkan, kerana ia melanggar skema XML dan prinsip kontrak antara muka.

Pilihan 2: Kunci Dihitung Taip

Untuk mengekalkan kontrak antara muka yang ketat, gunakan jenis kekunci terhitung untuk peta:

public enum KeyType {
    KEY,
    KEY2;
}

@XmlJavaTypeAdapter(MapAdapter.class)
Map<KeyType, String> mapProperty;

Pilihan 3: Pemasaran Dipermudah

Untuk memudahkan struktur marshaling lalai ke dalam , gunakan MapAdapter yang menukarkan Peta kepada susunan 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;
    }
}

Atas ialah kandungan terperinci Bagaimana untuk Memastikan Peta menjadi Elemen `nilai` dengan JAXB?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn