问题描述
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><service><result code="333"msg="sdfasfsa">dfd</result><cash>111</cash><commission>234</commission><orderNO>sdd</orderNO></service>想用jaxb实现java对象和xml的转换,xml的格式如上,在定义pojo类时可以定义一个Resulst类其中包括code、msg属性,一个service类,然后包括result、cash、commission、orderNo属性。。不过现在是想把result作为service的属性定义成String类型,不去单独定义类,该如何实现这种转换??求指导。。
解决方案
首先,你这个思想就违背了jaxb的意愿。既然你不想定义result这个类,那你service中的属性都可以不用定义了,直接使用XmlJavaTypeAdapter这样大的注解去marshal、unmarshal对象xml就行了。一般使用jaxb,如果属性为某个类库中定义的类,而需要转换为xml时,通过XmlJavaTypeAdapter来进行特殊处理。如插件开发中,元素属性为:org.eclipse.draw2d.geometry.Rectangle(矩形)时,通过XmlJavaTypeAdapter转换,如下所示:import javax.xml.bind.annotation.adapters.XmlAdapter;import org.eclipse.draw2d.geometry.Rectangle;public class LayoutXmlAdapter extends XmlAdapter<String, Rectangle>{@Overridepublic String marshal(Rectangle v) throws Exception {if(v == null) return "";return v.x + "," + v.y + "," + v.width + "," + v.height;}@Overridepublic Rectangle unmarshal(String v) throws Exception{if(v != null && v.trim().length() > 0){String[] ps = v.split(",");if(ps.length ==4){int x = Integer.parseInt(ps[0]);int y = Integer.parseInt(ps[1]);int width = Integer.parseInt(ps[2]);int height = Integer.parseInt(ps[3]);return new Rectangle(x, y, width, height);}}return new Rectangle(0, 0, 0, 0);}}如果你非要不定义result类,直接转换为:<result code="333"msg="sdfasfsa">dfd</result>那你可以使用XmlJavaTypeAdapter注解。
解决方案二:
result本身有两个属性,code和msg。如果result变成String型,打算怎么处理这两个属性呢?1.用String数组? [code, msg]这样2.分成service两个String类型属性。 resultCode resultMsg3.拼成一个String,定长或分隔符比如逗号。 分隔符时还得保证Msg里面别有分隔符无论如何,单单从已知的信息来说,有个类好些吧。不要类,可以用个Map替换。
解决方案三:
是要在不修改XML的前提下,修改Bean的结构吗?这样做好像有点违背java对象和xml相互对应转换的原则。可以把result这个bean留着,在service类的setResult(Result result)方法中,做一些处理,比如把result中的code、msg和自己的值set给service实例的变量就行了,然后把getResult()方法改成返回String类型的result的值。service类的两个方法:public String getResult() { return this.resultStr;}public void setResult(Result result) { this.resultStr = result.getResultValue(); //这就是result节点的文本值:dfd this.code = result.getCode(); this.msg = result.getMsg();}