2013-04-16 2 views
0

JAXB 객체가 있습니다. 그것을 serialize 할 때 결과는 재미 있습니다! 이와 같이 = 소스 XML 그냥 가지고, 반면>Jackson이 JAXB 객체를 직렬화하면 이상한 결과가 발생합니다.

{"formData":{ 
"preConditions":{ 
    "acceptTermsAndConditions":"<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<acceptTermsAndConditions>true</acceptTermsAndConditions>", 
    "receivePromoEmail":"<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<receivePromoEmail>false</receivePromoEmail>" 
}, etc... 

사실과 값으로 거짓 : -

<formData> 
    <preConditions> 
     <acceptTermsAndConditions>true</acceptTermsAndConditions> 
     <receivePromoEmail>false</receivePromoEmail> 
    </preConditions> etc... 

다음과 같이 JSON을 생성하는 내 코드는 다음과 같습니다 -

Application application = (Application) JAXBUtil.getXMLAsApplication(); 
    ObjectMapper mapper = new ObjectMapper(); 
    AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance()); 
    // make deserializer use JAXB annotations (only) 
    mapper.getDeserializationConfig().with(introspector); 
    // make serializer use JAXB annotations (only) 
    mapper.getSerializationConfig().with(introspector); 


    try { 
     mapper.writeValue(new File("application.json"), application); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

여기서, 위의 PreConditions 클래스는 J AXB2 (XJC). 다음은 스 니펫입니다. -

@XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { 
     "acceptTermsAndConditions", 
     "receivePromoEmail" 
    }) 
    public static class PreConditions { 

     @XmlElement(required = true) 
     protected Object acceptTermsAndConditions; 
     @XmlElement(required = true) 
     protected Object receivePromoEmail; 

     /** 
     * Gets the value of the acceptTermsAndConditions property. 
     * 
     * @return 
     *  possible object is 
     *  {@link Object } 
     *  
     */ 
     public Object getAcceptTermsAndConditions() { 
      return acceptTermsAndConditions; 
     } 

     /** 
     * Sets the value of the acceptTermsAndConditions property. 
     * 
     * @param value 
     *  allowed object is 
     *  {@link Object } 
     *  
     */ 
     public void setAcceptTermsAndConditions(Object value) { 
      this.acceptTermsAndConditions = value; 
     } 

     /** 
     * Gets the value of the receivePromoEmail property. 
     * 
     * @return 
     *  possible object is 
     *  {@link Object } 
     *  
     */ 
     public Object getReceivePromoEmail() { 
      return receivePromoEmail; 
     } 

     /** 
     * Sets the value of the receivePromoEmail property. 
     * 
     * @param value 
     *  allowed object is 
     *  {@link Object } 
     *  
     */ 
     public void setReceivePromoEmail(Object value) { 
      this.receivePromoEmail = value; 
     } 

    } 

JSON이 너무 미친 이유에 대한 단서가 있습니까?

+0

이 정보는 충분하지 않습니다. 'Application'유형의 정의를 추가 할 수 있습니까? 내 생각 엔 "acceptTermsAndConditions"와 "receivePromoEmail"은 DOM 문서 또는 그와 같은 POJO 유형이 아니며 원시 문자열로만 직렬화 될 수 있습니다. – StaxMan

+0

요청에 따라 응용 프로그램 유형에 대한 정보로 업데이트되었습니다. – Nebu

+0

아. 자, 문제는'Application.FormData' ("이상한"JSON이있는 곳)에 있습니다. 그것도 추가 할 수 있습니까? 나는 여전히 유형이 DOM'Element' 또는 XML을 덤핑하는 것 이외의 다른 방법으로는 처리 할 수없는 다른 XML 특정 유형으로 선언된다고 생각합니다. – StaxMan

답변

0

acceptTermsAndConditions의 공칭 유형은 java.lang.Object이므로 정확하게 무엇이 진행되고 있는지 알기가 어렵습니다. serializer는 직렬화시 런타임 유형을 기반으로 선택됩니다. 내 생각에 DOM Document이 될 것입니다. deserialization에서 너무 잘 작동하지 않으며 단지 java.util.Map이됩니다.

더 구체적인 유형을 생성하도록 스키마를 변경해야 할 수도 있습니다. java.lang.Object 인 경우 문제가 발생할 수 있습니다.

직렬화 전에 오브젝트에있는 실제 Java 유형을 볼 수 있습니다. 이상한 결과가 나오는 곳을 설명해야합니다. 나는 그것이 단순한 불리언 값일 수 있다고 생각하지 않는다.

+0

StaxMan - 통찰력에 감사드립니다. 불행히도 스키마를 변경할 수 없습니다. 런타임 유형을 살펴 보았고 org.apache.xerces.dom.ElementNSImpl이므로이 유형의 사용자 정의 직렬 변환기를 작성하여 문제점을 해결했습니다. 이 유형은 스키마에 유형이 지정되지 않은 경우 XJC에 의해 생성되는 기본 유형이므로 Jackson 구현에이 직렬자를 포함하지 않았다는 것에 놀랍습니다. – Nebu

+0

Jackson은 JAXB 구현이 아니므로 가장 좋은 방법은 String으로 직렬화하는 것입니다 (DOM 요소의 serializer가 있습니다). 기본적으로 DOM 요소는 또 다른 외계인 데이터 유형입니다. 맞춤 직렬자는 JSON 구조로 변환하려는 경우 의미가 있습니다. – StaxMan

관련 문제