diff --git a/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/QNameDeserializer.java b/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/QNameDeserializer.java new file mode 100644 index 000000000..a904a655f --- /dev/null +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/QNameDeserializer.java @@ -0,0 +1,33 @@ +package com.fasterxml.jackson.dataformat.xml.deser; + +import javax.xml.namespace.QName; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + + +public class QNameDeserializer extends JsonDeserializer { + JsonDeserializer originalDeserializer; + public QNameDeserializer(JsonDeserializer deserializer) { + originalDeserializer = deserializer; + } + + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { + QName qName = (QName) originalDeserializer.deserialize(p, ctxt); + + if (qName.getLocalPart().indexOf(":") > 0) { + String prefix = qName.getLocalPart().split(":")[0]; + String localPart = qName.getLocalPart().split(":")[1]; + String namespace = ((FromXmlParser)ctxt.getParser()).getStaxReader().getNamespaceContext().getNamespaceURI(prefix); + + return new QName(namespace, localPart, prefix); + } + + return qName; + } +} diff --git a/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/XmlBeanDeserializerModifier.java b/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/XmlBeanDeserializerModifier.java index 303ba80c6..3afbfa8d9 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/XmlBeanDeserializerModifier.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/XmlBeanDeserializerModifier.java @@ -1,5 +1,6 @@ package com.fasterxml.jackson.dataformat.xml.deser; +import javax.xml.namespace.QName; import java.util.*; import com.fasterxml.jackson.databind.*; @@ -81,6 +82,10 @@ public List updateProperties(DeserializationConfig confi public JsonDeserializer modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer deser0) { + if (beanDesc.getBeanClass() == QName.class) { + return new QNameDeserializer(deser0); + } + if (!(deser0 instanceof BeanDeserializerBase)) { return deser0; } diff --git a/src/test/java/com/fasterxml/jackson/dataformat/xml/deser/QNameTest.java b/src/test/java/com/fasterxml/jackson/dataformat/xml/deser/QNameTest.java new file mode 100644 index 000000000..43d704bcb --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/dataformat/xml/deser/QNameTest.java @@ -0,0 +1,35 @@ +package com.fasterxml.jackson.dataformat.xml.deser; + +import static junit.framework.TestCase.assertEquals; + +import javax.xml.namespace.QName; + +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import org.junit.Test; + +public class QNameTest { + protected static class Parent { + public Level1 level1; + } + + protected static class Level1 { + public QName name; + } + + private final XmlMapper MAPPER = XmlMapper.builder() + .defaultUseWrapper(false) + .build(); + + @Test + public void testQNameParser() throws Exception + { + String xml = + "\n" + + " \n" + + ""; + + Parent bean = MAPPER.readValue(xml, Parent.class); + + assertEquals("{urn:example:types:r1}DateTime", bean.level1.name.toString()); + } +}