Сериализация Джексона объекта JAXB дает странные результаты

У меня есть объект 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...

Принимая во внимание, что исходный XML имеет значения true и false в качестве значений:

  <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 генерируется JAXB2 (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 такой сумасшедший?

1 ответ

Решение

Так как номинальный тип для acceptTermsAndConditions является java.lang.ObjectТрудно понять, что именно происходит. Сериализатор будет выбран в зависимости от типа среды выполнения при сериализации - я предполагаю, что это будет DOM Document, При десериализации это не сработает, а просто станет java.util.Map,

Таким образом, вам может потребоваться изменить схему, чтобы генерировать более конкретные типы: что угодно с java.lang.Object могут вызвать проблемы.

Возможно, вы захотите увидеть реальные типы Java, которые есть у вашего объекта до сериализации. Это должно объяснить, откуда происходит странный вывод. Я не думаю, что это может быть просто логическое значение.

Другие вопросы по тегам