JAXB を使用してマップを「value」要素にマーシャリングする方法

Susan Sarandon
リリース: 2024-11-13 04:25:02
オリジナル
284 人が閲覧しました

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

マップを value にマーシャリングします。 JAXB の

問題

マップは通常、次のような XML 構造にマーシャリングされます。

<map>
  <entry>
    <key>KEY</key>
    <value>VALUE</value>
  </entry>
  <entry>
    <key>KEY2</key>
    <value>VALUE2</value>
  </entry>
  ...
</map>
ログイン後にコピー

ただし、場合によっては、キーが要素名になり、値がその内容になります:

<map>
  <KEY>VALUE</KEY>
  <KEY2>VALUE2</KEY2>
 ...
</map>
ログイン後にコピー

解決策

オプション 1: 動的に名前が付けられた XML 要素

動的属性名の使用は推奨されません。これは、XML スキーマとインターフェイス コントラクトの原則に違反します。

オプション 2: 列挙型キー タイプ

厳密なインターフェイス コントラクトを維持するには、マップに列挙型キー タイプを使用します。

public enum KeyType {
    KEY,
    KEY2;
}

@XmlJavaTypeAdapter(MapAdapter.class)
Map<KeyType, String> mapProperty;
ログイン後にコピー

オプション 3: 簡素化されたマーシャリング

デフォルトのマーシャリング構造を に簡略化するには、次を使用します。 Map を MapElements の配列に変換する MapAdapter:

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> {
    @Override
    public MapElements[] marshal(Map arg0) {
        MapElements[] mapElements = new MapElements[arg0.size()];
        int i = 0;
        for (Entry entry : arg0.entrySet()) {
            mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());
        }
        return mapElements;
    }
    
    @Override
    public Map unmarshal(MapElements[] arg0) {
        Map r = new TreeMap<>();
        for (MapElements mapelement : arg0) {
            r.put(mapelement.key, mapelement.value);
        }
        return r;
    }
}

以上がJAXB を使用してマップを「value」要素にマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート