Сериализация Джексона объекта 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, которые есть у вашего объекта до сериализации. Это должно объяснить, откуда происходит странный вывод. Я не думаю, что это может быть просто логическое значение.