2012-07-12 42 views
4

对象模型的元素类型为String我可以得到莫西将字符串转换为布尔产生JSON

public class LifeSpan { 

protected String begin; 
protected String end; 
@XmlJavaTypeAdapter(CollapsedStringAdapter.class) 
protected String ended; 
.... 

的结束,但它实际上只有永远一个布尔值,(我不知道的意义XmlJavaTypeAdapter注释)

当作为XML输出给

<life-span><begin>1999-04</begin><ended>true</ended></life-span> 

因此,如果定义为布尔或字符串

其实并不重要

但JSON输出

"life-span" : { 
     "begin" : "1999-04", 
     "ended" : "true" 
     }, 

,当我需要它是

"life-span" : { 
     "begin" : "1999-04", 
     "ended" : true 
     }, 

我真的不能改变对象模型,所以以为我也许能映射到oxml.xml正确的类型文件,并试图

<java-type name="LifeSpan"> 
      <java-attributes> 
       <xml-element java-attribute="ended" type="boolean"/> 
      </java-attributes> 
     </java-type> 

但它没有那样。

回答

3

下面是如何支持这个用例EclipseLink JAXB (MOXy)

BooleanStringAdapter

XmlAdapter让你封一个类型的对象作为另一种类型(见http://blog.bdoughan.com/2010/07/xmladapter-jaxbs-secret-weapon.html)。在这个例子中,我们想将String的值作为Boolean之一。

package forum11451880; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class BooleanStringAdapter extends XmlAdapter<Boolean, String> { 

    @Override 
    public String unmarshal(Boolean v) throws Exception { 
     return v.toString(); 
    } 

    @Override 
    public Boolean marshal(String v) throws Exception { 
     return Boolean.valueOf(v); 
    } 

} 

oxm.xml

我们可以利用莫西的外部映射文件,以增加通过注释提供的元数据中我们XmlAadapter挂钩(见http://blog.bdoughan.com/2010/12/extending-jaxb-representing-annotations.html)。

<?xml version="1.0"?> 
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="forum11451880"> 
    <java-types> 
     <java-type name="LifeSpan"> 
      <java-attributes> 
       <xml-element java-attribute="end"> 
        <xml-java-type-adapter value="forum11451880.BooleanStringAdapter"/> 
       </xml-element> 
      </java-attributes> 
     </java-type> 
    </java-types> 
</xml-bindings> 

寿命

下面是你的域模型与String类型的end财产。你需要

package forum11451880; 

import javax.xml.bind.annotation.*; 
import javax.xml.bind.annotation.adapters.*; 

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

    protected String begin; 

    protected String end; 

    @XmlJavaTypeAdapter(CollapsedStringAdapter.class) 
    protected String ended; 

} 

jaxb.properties

要指定莫西为您的JAXB提供者包括与跟随着进入所谓jaxb.properties文件(见http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

演示

dem以下的演示代码介绍如何利用外部映射文档。

package forum11451880; 

import java.util.*; 
import javax.xml.bind.*; 
import org.eclipse.persistence.jaxb.JAXBContextProperties; 
import org.eclipse.persistence.jaxb.MarshallerProperties; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Map<String, Object> properties = new HashMap<String, Object>(1); 
     properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum11451880/oxm.xml"); 
     JAXBContext jc = JAXBContext.newInstance(new Class[] {LifeSpan.class}, properties); 

     LifeSpan lifeSpan = new LifeSpan(); 
     lifeSpan.begin = "1999-04"; 
     lifeSpan.end = "true"; 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(lifeSpan, System.out); 

     marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json"); 
     marshaller.marshal(lifeSpan, System.out); 
    } 

} 

输出

下面是从运行的例子中的输出。正如你可以看到出现在true值不带引号:

<?xml version="1.0" encoding="UTF-8"?> 
<lifeSpan> 
    <begin>1999-04</begin> 
    <end>true</end> 
</lifeSpan> 
{ 
    "lifeSpan" : { 
     "begin" : "1999-04", 
     "end" : true 
    } 
} 
+1

三江源的作品(实际上是属性结束,虽然有可能结束attribut EAS好,我没有显示),再次感谢你的帮助上这个。 – 2012-07-12 18:36:05