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

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

Susan Sarandon
Lepaskan: 2024-11-13 04:25:02
asal
418 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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;
Salin selepas log masuk

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;
    }
}
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan