xstream 自定義 Converter

今天開發(fā)接口,遇到xml的格式比較特別大概格式為

<DBSET>
<R>
  <C N="RECORD_ID">111111</C>
  <C N="ORG_NO">2222</C>
</R>
<R>
  <C N="RECORD_ID">333</C>
  <C N="ORG_NO">4444</C>
</R>
</DBSET>

目前解決思路就是將R看做Map, C看做一個鍵值對。

<R>
  <C N="RECORD_ID">111111</C>
  <C N="ORG_NO">2222</C>
</R>

理解為

{
    RECORD_ID: 111111,
    ORG_NO: 2222
}

定義一個JavaBean用來描述<R/>

@XStreamAlias("R")
@XStreamConverter(ResultConverter.class)
public class Result {
    
    public Map<String, Object> result = new HashMap<String, Object>();
    
    public void put(String key, Object val){
        result.put(key, val);
    }
    
    public void putAll(Map<String,Object> map) {
        result.putAll(map);
    }
    
    public Object get(String key) {
        return result.get(key);
    }
    
}

Converter

public class ResultConverter implements Converter {

    @Override
    public boolean canConvert(Class class_) {

        return "com.zhbr.ws.inf.yx.ws.entity.yxhc2.Result".equals(class_.getName());
    }

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer,
            MarshallingContext context) {
        Result r = (Result) source;
        Map<String,Object> result =  r.result;
        
        if(result.isEmpty()) return;
        
        for(Entry<String,Object> entry: result.entrySet()){
             writer.startNode("C");
             writer.addAttribute("N", entry.getKey());
             writer.setValue( StrUtil.toStr(entry.getValue()));             
             writer.endNode();
        }
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader,
            UnmarshallingContext context) {
        Result r = new Result();
        while (reader.hasMoreChildren()) {
            reader.moveDown();
            
            if ("C".equals(reader.getNodeName())) {
                String col = reader.getAttribute("N");              
                String val = reader.getValue();
                r.put(col, val);                
            }            
            reader.moveUp();
        }
        return r;
    }
}

測試

Result r = new Result();
r.put("RETURN_MSG", "xxx");
r.put("RETURN_FLAG", "0");

String xml = XmlUtil.toXml(r);
System.out.println(xml);

Result r2 = XmlUtil.toBean(xml, Result.class);
System.out.println(r2);

輸出

<R>
  <C N="RETURN_MSG">xxx</C>
  <C N="RETURN_FLAG">0</C>
</R>

RETURN_MSG: xxx,RETURN_FLAG: 0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容