2016-09-15 4 views
7

도메인 모델을 XML 및 JSON 표현으로 변환하는 데 JAXB를 사용하고 있습니다. XMl/JSON으로 변환 할 수있는 학생용 버전이 있습니다. 모든 데이터 형식이 될 수있는 content 속성이 있습니다. 그것을 위해xsi : xml/json JAXB에서 정보를 입력하십시오.

스키마 정의 :

<xs:element name="content" type="xs:anyType" /> 

는 따라서 자바 파일이 생성 콘텐츠에 대한 Object 유형이 있습니다.

Student.java :

@XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { 
     "content" 
    }) 
    @XmlRootElement(name = "student") 
    public class Student 
     extends People 
    { 
     ................ 

     @XmlElement(required = true) 
     protected Object content; 

    } 

I 마샬 다음 코드를 사용하여 :

마샬 :

Map<String, Object> properties = new HashMap<String, Object>(1); 
       properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "name-binding.xml"); 


    this.ctx = JAXBContext.newInstance("packagename", 
    packagename.ObjectFactory.class.getClassLoader(), properties); 

    Marshaller marshaller = ctx.createMarshaller(); 

    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.setProperty(MarshallerProperties.MEDIA_TYPE,media-type); 
     marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT,true); 
     marshaller.setProperty(MarshallerProperties.JSON_REDUCE_ANY_ARRAYS, true); 

     StringWriter sw = new StringWriter(); 
     marshaller.marshal(object, sw); 

XML :

<student> 

    <name>Jack n Jones</name> 
    <content xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">Sid</content> 

</student> 

xmlns:xsixsi:type="xsd:string">이 content 요소에 추가됩니다. XML에서이 유형 정보를 원하지 않습니다.

마찬가지로 JSON에 대한이 유형의 정보를 추가합니다

JSON : 나는 형식 정보를 제거하고 런타임에서 그것의 종류에 따라 XML/JSON을 생성 할 수있는 방법

 { 
      "name" : "Jack n Jones", 
      "content" : { 
       "type" : "string", 
       "value" : "Sid" 
      } 
     } 

.

<student> 

     <name>Jack n Jones</name> 
     <content>Sid</content> 

    </student> 

답변

2

에 java.lang.Object로 매개 변수를 전달하고 JAXB 주석 POJO과 : 내용은 다음 XML String 경우에 따라서 어떤 유형 것은 content 그것의 예를 들어 유형 정보

없이 유형 로 변환 수 마샬링 후에 추가로 생성 된 메타 정보가없는 것은 불가능합니다. Object는 "unknown"타입이기 때문에, 마샬링 프로세스 중에 검출되고 변환되어야하며, 메타 데이터는 항상 디폴트 마샬 러에 의해 생성 될 것이다. 이 시점에서, 당신은 세 가지 옵션이

  1. 사용자 정의 마샬 또는 어댑터는
  2. 를 사용하여 문자열 대신 (빠르고 깨끗한 솔루션) 객체
  3. 하면 (WEB에서 예 많음이있다) 화이트 당신은 정말로 일반적인 것을 사용해야 만합니다. "Element"(https://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/annotation/XmlAnyElement.html)