We needs some help for this case :
we use :
jackson 2.9.0
jdk 1.8
XML to deserialize :
<?xml version="1.0" encoding="utf-8"?>
<RESPONSE>
<RPBODY>
<DATA>
</DATA>
</RPBODY>
</RESPONSE>
Main.java
public class JacksonTest {
public static void main(String[] args) throws JsonParseException,
IOException {
ObjectMapper objectMapper = new XmlMapper();
objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT,
true);
objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT,
true);
objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES,
true);
objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY,
true);
objectMapper.configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES,
false);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
false);
JacksonTest test = new JacksonTest();
InputStream inputStream =
test.getClass().getResourceAsStream("emptyData2.xml");
test.parse(objectMapper.getFactory(), inputStream,
DataTestRoot.class, "UTF-8");
}
public <T> T parse(JsonFactory jfactory, InputStream in, Class<T>
klass, String charset) throws JsonParseException, IOException {
if (jfactory == null) {
throw new IllegalArgumentException("this method must be used
with an instance initialized with a ObjectMapper");
}
T result = null;
JsonParser p = jfactory.createParser(in);
JsonToken jToken = null;
while ((jToken = p.nextToken()) != null) {
if (jToken == JsonToken.FIELD_NAME) {
String fieldName = p.getCurrentName();
if ("RPBODY".equals(fieldName)) {
p.nextToken();
try {
result = p.readValueAs(klass);
} catch (Throwable e) {
throw new IOException(e);
}
} else if ("RPHEADER".equals(fieldName)) {
p.nextToken();
JsonNode rpHeader = p.readValueAs(JsonNode.class);
String status = rpHeader.get("STATUSID").asText();
long statusId = 0;
if (NumberUtils.isNumber(status)) {
statusId = NumberUtils.toLong(status);
}
if (statusId < 0) {
throw new IOException(status);
}
}
}
}
return result;
}
private static class DataTestRoot {
@JacksonXmlProperty(localName = "DATA")
public DataListTest data;
}
private static class DataListTest {
@JacksonXmlProperty(localName = "ITEM")
@JacksonXmlElementWrapper(localName = "ITEM", useWrapping = false)
public List<Data> datas;
}
}
Error :
> Exception in thread "main" java.io.IOException:
> com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot
> construct instance of `jackson.JacksonTest$DataListTest` (although at least
> one Creator exists): no String-argument constructor/factory method to
> deserialize from String value ('
')
at [Source: (BufferedInputStream); line: 5, column: 10] (through reference
> chain: ch.hcuge.deja.jackson.JacksonTest$DataTestRoot["DATA"])
the error seems to be in this method :
*com.fasterxml.jackson.databind.deser.ValueInstantiator#_createFromStringFallbacks*
the String value parsed is "\n\t\t" (cf PJ)
but no trim is done in the test *if (value.length() == 0)*
What's wrong ? our system to parse an XML request ? we forget something ?
thanks for your help.
<https://lh3.googleusercontent.com/-MRMsYyaUWwY/WZLwLO-SYkI/AAAAAAAATjE/XwGfkP-EIywJOGpMRvQIZuepMcfyBPdLgCLcBGAs/s1600/test.jpg>
<https://lh3.googleusercontent.com/-MRMsYyaUWwY/WZLwLO-SYkI/AAAAAAAATjE/XwGfkP-EIywJOGpMRvQIZuepMcfyBPdLgCLcBGAs/s1600/test.jpg>
--
You received this message because you are subscribed to the Google Groups
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.