Closed mbladel closed 1 year ago
Quick note(s):
<item />
and <item></item>
are semantically equivalent in XML and although (some) parsers can indicate difference (Woodstox does) -- and most can produce one or the other explicitly -- it's not a good idea to try to use difference for semantics, due to interoperability concerns.
Having said that, yes, handling of String
values in Arrays or typed Collection
s should work the same way as individual properties. Handling of difference between null
and empty String are tricky, and I think Array/Collection deserializers probably have some shortcuts that would need to be disabled for XML.
Thanks for the feedback.
<item />
and<item></item>
are semantically equivalent in XML
I agree that's working as expected, that is why I went for the xsi:nil
approach in the example - just wanted to exhaust all possibilities with the different configurations/features and let you know what I found from my testing.
@mbladel yes good. I did realize it is/was not the main point. Mostly mentioned since at some point I was trying to consider/expose distinction and spent some time thinking about it.
Environment: Jackson Dataformat XML 2.14.2
We are trying to serialize and deserialize arrays or collections of Strings containing both empty and
null
values. We noticed thatnull
s are handled correctly when serializing:<item />
, while empty strings as<item></item>
ToXmlGenerator.Feature.WRITE_NULLS_AS_XSI_NIL
works as expectedWhen parsing this values back
null
elements have become empty (""
) values. We tried:FromXmlParser.Feature.PROCESS_XSI_NIL
, even though it should be enabled by defaultFromXmlParser.Feature.EMPTY_ELEMENT_AS_NULL
But we still got empty String values as a result.Testing showed that with simple String attributes inside a class both null and empty values are correctly handled during deserialization, as expected (see also https://github.com/FasterXML/jackson-dataformat-xml/issues/354).
The behavior of String values inside collections should be aligned to how String attributes inside objects are handled.
Here's an example: