FasterXML / FasterXML/jackson-module-scala
XML collection duplicated element names
- Dominant language
- Scala
- Stars
- 506
- Forks
- 138
- Avg merge
- 3h 6m
- Merged PRs (30d)
- 48
Description
I'm having trouble getting a case class with a collection field to serialize the way I want.
I have a data model that looks like this:
``` scala
@JsonRootName("document")
case class Document(header: Header)
case class Header(authors: Seq[Author])
case class Author(name: String)
```
And I'm using Jackson to produce an XML:
``` scala
val doc = Document(Header(Seq(Author("Dick Jones"), Author("Bob Morton"))))
val mapper = new XmlMapper()
mapper.registerModule(DefaultScalaModule)
val xml = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(doc)
```
The document that looks like this:
``` xml
Dick Jones
Bob Morton
```
But `` is duplicated with its nested elements. I want the `` tag to contain a list of `` elements.
I can get this output by adding the following annotations to the Header case class:
``` scala
case class Header(@JacksonXmlElementWrapper(localName = "authors") @JacksonXmlProperty(localName = "author") authors: Seq[Author])
```
This serializes the way I want, but when deserializing I get the following exception:
```
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Could not find creator property with name 'authors' (in class sample.Header)
at [Source: java.io.StringReader@3d778e7; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:216)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:894)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:541)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:228)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:143)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:406)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:352)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:444)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:946)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:446)
at com.fasterxml.jackson.databind.deser.std.DelegatingDeserializer.resolve(DelegatingDeserializer.java:61)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:296)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:477)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3890)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3785)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2779)
at sample.Main$.main(Message.scala:26)
at sample.Main.main(Message.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
```
Is there something I can do to get this to deserialize properly?
Thanks for your help!
Contributor guide
No contributing guide indexed for this repository
Research direction
Start by reproducing the case classes and XmlMapper setup shown in the issue, including the annotated Header and the round-trip deserialization. Trace how Jackson's Scala module handles constructor creator properties together with JacksonXmlElementWrapper and JacksonXmlProperty. Done means the authors wrapper serializes with author elements and the resulting XML deserializes back into Document successfully.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- scala
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100