Map節(jié)點(diǎn)的名稱(chēng)變更

2018-12-13 23:13 更新

Map節(jié)點(diǎn)的名稱(chēng)變更

改造需要的代碼量比較多,因?yàn)镴AXB原生不指定Map的自定義操作。也可以說(shuō)JAXB不支持Map這種數(shù)據(jù)類(lèi)型。所以需要使用到適配器來(lái)擴(kuò)展Jaxb的功能。

首先定義一個(gè)類(lèi),其中只有兩個(gè)字段,為了簡(jiǎn)單,可以不寫(xiě)setters/getters方法。通過(guò)這種方式模擬一個(gè)Map,只包含key/value,也就是first/second,這個(gè)名稱(chēng)就是XML的節(jié)點(diǎn)顯示名稱(chēng)。

public class XmlMap {


    public String first;
    public String second;
}

自定義一個(gè)Adapter,這里將所有的代碼都展示出來(lái)。

public class MapAdapter extends XmlAdapter<XmlMap[], Map<String, String>>{
    @Override
    public Map<String, String> unmarshal(XmlMap[] v) throws Exception {
        Map<String, String> map = new HashMap<>();
        for(int i=0;i<v.length;i++) {
            XmlMap pairs = v[i];
            map.put(pairs.first, pairs.second);
        }
        return map;
    }
    @Override
    public XmlMap[] marshal(Map<String, String> v) throws Exception {
        XmlMap[] xmlMap = new XmlMap[v.size()];
        int index = 0;
        for(Map.Entry<String, String> entry: v.entrySet()) {
            XmlMap xm = new XmlMap();
            xm.first = entry.getKey();
            xm.second = entry.getValue();
            xmlMap[index++] = xm;
        }
        return xmlMap;
    }
}

@XmlJavaTypeAdapterJAXB能夠內(nèi)置支持List和Set集合,但是對(duì)于Map的支持需要自己處理。它繼承自抽象類(lèi)XmlAdapter<ValueType,BoundType> 類(lèi)型參數(shù):

  • BoundType JAXB 不知道如何處理的一些類(lèi)型。自定義的類(lèi)型,告訴Jaxb ValueType 將此類(lèi)型用作內(nèi)存表示形式。
  • ValueType JAXB 無(wú)需其他操作便知道如何處理的類(lèi)型。

這里的Map對(duì)于JAXB是一個(gè)未知類(lèi)型,但是XmlMap[]卻是已知的對(duì)象數(shù)組類(lèi)型。通過(guò)中間的轉(zhuǎn)化賦值,可以使XmlMap[]Map相互轉(zhuǎn)化,從而讓Jaxb知道數(shù)據(jù)如何處理。

在之前的Product中,在Map上加上注解@XmlJavaTypeAdapter(MapAdapter.class)。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Product2 {


    private String id;


    @XmlJavaTypeAdapter(MapAdapter.class)
    public Map<String, String> category;
//  setters, getters

測(cè)試一下:

@Test 
    public void test2() throws JAXBException {
        Map<String, String> map = new HashMap<>();
        map.put("衣服", "大衣");
        map.put("褲子", "西褲");
        Product2 product = new Product2();
        product.setId("1402");
        product.setCategory(map);

        
        JAXB.marshal(product, System.out);
    }

得到的結(jié)果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<product2>
    <id>1402</id>
    <category>
        <item>
            <first>衣服</first>
            <second>大衣</second>
        </item>
        <item>
            <first>褲子</first>
            <second>西褲</second>
        </item>
    </category>
</product2>

上面的所有節(jié)點(diǎn)名稱(chēng)除了item都是可以通過(guò)一定的方法改變的。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)